Ale*_*iev 7 c++ language-lawyer user-defined-literals c-preprocessor
考虑 Aykhan Hagverdili 提供的以下示例:
#include <string>
using std::operator""s;
#define s foobar
auto s = "hello world"s;
Run Code Online (Sandbox Code Playgroud)
有些编译器会替换s并导致编译失败。有些编译器不会替代s.
请参阅此处的结果: https: //godbolt.org/z/jx4nhYczd gcc 失败,clang 编译
哪个是对的?
use*_*522 10
"hello world"s从 C++11 开始,是与用户定义的字符串文字语法产生式匹配的单个预处理标记。
宏在预处理标记级别上进行替代。由于没有s预处理标记,因此不能对宏进行任何替换。
因此,您的代码在 C++14 或更高版本中格式良好。std::operator""s被选中。在 C++11 中没有std::operator""s.
然而,在 C++11 之前,当引入用户定义的文字时,"hello world"s将有两个预处理标记"hello"和s,因此后一个标记将被替换为您的宏。
这甚至在[diff.cpp03.lex]/2中明确提到为与 C++11 向后不兼容的更改。
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |