我正在学习用户定义的文字,并与以下测试代码混淆:
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;
}
编译器提供以下错误消息:
错误:没有匹配的文字运算符来调用&#39;运算符&#34;&#34; _s.count&#39;使用类型&#39; unsigned long long&#39;或者&#39; const char *&#39;,并且没有匹配的文字操作员模板
cout&lt;&lt; 4_s.count()&lt;&lt; ENDL;
似乎 _s.count 是用户定义的文字。此外,浮点文字的行为类似于整数文字。
为什么用户定义的整数文字和字符串文字有不同的行为?
答案 0 :(得分:17)
这就是浮点文字的工作原理!!
添加一对括号,它应该可以工作:
std::cout << (4_s).count();
或者,将它们分开(以阻止编译器将其解释为格式错误的小数常量浮点字面值):
std::cout << 4_s .count();
// ^ Space here!
在上述参考文献的 Notes 部分,
由于最大的munch,用户定义的整数和浮点文字以[
p
,P
,(自C ++ 17)]e
和E
结尾,当跟随运算符+
或-
时,必须与源中的空格的运算符分开:long double operator""_E(long double); long double operator""_a(long double); int operator""_p(unsigned long long); 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上测试了上面的示例,并得到了非常 silimar错误消息:
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-suffix ?
我的原始解释尝试可以在本文的revision history中找到。