考虑 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(使用前将#替换为@)