我正在学习用户定义的文字,并与以下测试代码混淆:
std::chrono::seconds operator"" _s(unsigned long long s) {
return std::chrono::seconds(s);
}
std::string operator"" _str(const char *s, std::size_t len) {
return std::string(s, len);
}
int main() {
auto str = "xxxxx"_str;
std::cout << str.size() << std::endl; // works
auto sec = 4_s;
std::cout << sec.count() << std::endl; // works
std::cout << "xxxxx"_str.size() << std::endl; // works
std::cout << 4_s.count() << std::endl; // does **NOT** work!
return 0;
}编译器提供以下错误消息:
错误:没有匹配的文字运算符调用“_s.count”,参数为‘无符号长’或'const *',也没有匹配的文字运算符模板 cout << 4_s.count() << endl;
它似乎将_s.count作为用户定义的文字。此外,浮点文字的行为类似于整数文字.
为什么用户定义的整数文字和字符串文字有不同的行为?
发布于 2017-11-24 06:24:33
这就是浮点文本的工作方式!!
添加一对括号,它应该有效:
std::cout << (4_s).count();或者,将它们分开(以阻止编译器将其解释为格式错误的分式常量浮点文字):
std::cout << 4_s .count();
// ^ Space here!参考资料:CppReference.com
在上面引用的Notes部分中,
由于最大munch,用户定义的整数和浮点文本以
p、P、(自C++17)e和E结尾,当后面跟着操作符+或-时,必须与源中的空格分隔: 长双运算符_E(长双);长双运算符“_a(长双);int运算符”_p(无符号长);auto x= 1.0_E+2.0;// error auto y= 1.0_a+2.0;// OK auto z= 1.0_E +2.0;// OK auto w= 1_p+2;// error auto u= 1_p +2;/ OK
因此,当它被用作小数点时,它必须与后面的任何东西分开,否则它将被视为浮点数的部分。
我从CppReference中测试了上面的示例,得到了非常类似的错误消息:
test.cpp:19:10: error: unable to find numeric literal
operator 'operator""_E+2.0'
^^^^^^
auto x = 1.0_E+2.0; // error明白了_E+2.0是如何被看作是一个完整的ud-后缀的。
我最初的解释尝试可以在这篇文章的修订史中找到。
https://stackoverflow.com/questions/47467296
复制相似问题