预处理器是否在`operator""_name`中定义替换

2024-04-05

考虑 Aykhan Hagverdili 提供的以下示例:

#include <string>

using std::operator""s;

#define s foobar

auto s = "hello world"s;

有些编译器会替代s并且编译失败。 有些编译器不会替代s.

在这里查看结果:https://godbolt.org/z/jx4nhYczd https://godbolt.org/z/jx4nhYczdgcc 失败,clang 编译

哪个是对的?


"hello world"s从 C++11 开始,是一个与用户定义的字符串文字 https://timsong-cpp.github.io/cppwp/n4868/lex#nt:user-defined-string-literal语法产生。

宏在预处理标记级别上进行替代。既然没有s预处理令牌,不能对您的宏进行任何替换。

因此,您的代码在 C++14 或更高版本中格式良好。std::operator""s被选中。在 C++11 中没有std::operator""s.

然而,在 C++11 引入用户定义文字之前,"hello world"s将是两个预处理标记"hello" and s,因此后一个将被您的宏替换。

这甚至在[diff.cpp03.lex]/2 https://timsong-cpp.github.io/cppwp/n4868/diff.cpp03.lex#2作为与 C++11 向后不兼容的更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预处理器是否在`operator""_name`中定义替换 的相关文章

随机推荐