为什么用户定义的字符串文字和整数文字具有不同的行为?
Why do user-defined string literals and integer literals have different behavior?
我正在学习用户定义的字面量,并与以下测试代码混淆:
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;
}
编译器给出以下错误信息:
error: no matching literal operator for call to 'operator""_s.count' with argument of type 'unsigned long long' or 'const char *', and no matching literal operator template
cout << 4_s.count() << endl;
好像是把_s.count作为自定义字面量。此外,浮点文字的行为类似于整数文字。
为什么用户定义的整数文字和字符串文字有不同的行为?
这就是浮点数文字的工作原理!!
添加一对括号,它应该可以工作:
std::cout << (4_s).count();
或者,将它们分开(以阻止编译器将其解释为格式错误的小数常量浮点文字):
std::cout << 4_s .count();
// ^ Space here!
在上述参考文献的注释部分,
Due to maximal munch, user-defined integer and floating point literals ending in [p
, P
, (since C++17)] e
and E
, when followed by the operators +
or -
, must be separated from the operator with whitespace in the source:
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 测试了上面的例子,得到了一个非常 类似的错误消息:
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?
我原来的解释尝试可以在这个post的revision history中找到。
我正在学习用户定义的字面量,并与以下测试代码混淆:
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;
}
编译器给出以下错误信息:
error: no matching literal operator for call to 'operator""_s.count' with argument of type 'unsigned long long' or 'const char *', and no matching literal operator template
cout << 4_s.count() << endl;
好像是把_s.count作为自定义字面量。此外,浮点文字的行为类似于整数文字。
为什么用户定义的整数文字和字符串文字有不同的行为?
这就是浮点数文字的工作原理!!
添加一对括号,它应该可以工作:
std::cout << (4_s).count();
或者,将它们分开(以阻止编译器将其解释为格式错误的小数常量浮点文字):
std::cout << 4_s .count();
// ^ Space here!
在上述参考文献的注释部分,
Due to maximal munch, user-defined integer and floating point literals ending in [
p
,P
, (since C++17)]e
andE
, when followed by the operators+
or-
, must be separated from the operator with whitespace in the source: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 测试了上面的例子,得到了一个非常 类似的错误消息:
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?
我原来的解释尝试可以在这个post的revision history中找到。