C++ 为什么用户定义的字符串文字和整数文字有不同的行为?
我正在学习用户定义的文字,并对以下测试代码感到困惑:C++ 为什么用户定义的字符串文字和整数文字有不同的行为?,c++,c++11,user-defined-literals,C++,C++11,User Defined Literals,我正在学习用户定义的文字,并对以下测试代码感到困惑: 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 =
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;
}
std::chrono::seconds运算符“”\u s(无符号长字符){
返回标准时间:秒;
}
std::string运算符“”\u str(常量字符*s,std::size\u t len){
返回标准::字符串(s,len);
}
int main(){
auto str=“xxxxx”\u str;
std::cout浮点文本就是这样工作的!!
添加一对括号,应该可以:
std::cout << (4_s).count();
因此,对于用作小数点的点,它必须与后面的任何内容分开,否则将被视为浮点数的一部分
我已经从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
明白了\u E+2.0
是如何被视为一个完整的ud后缀的吗
我最初的解释尝试可以在这篇文章的后面找到。那么(4个)。计数呢?(4个)。计数
有效。你不能有(
或)
在ud后缀中
@for\u堆栈中似乎很奇怪,
也不能在ud后缀中使用;无法理解为什么\u s。count
被解析为整个ud后缀
@songyuanyao很高兴见到你。如果能找到解释,这并不奇怪。4.s.count
被解析为一个标记,这就是tole由预处理器分级,在预处理后但在语法和语义分析之前,但不能转换为有效的标记(例如整型文字或浮动文字),因此违反了。无可否认,编译器错误在这种情况下完全没有帮助。这个问题不是关于如何使它工作,而是关于为什么它不工作。显然,使用字符串和整数时优先级不同,但我相信,这个问题的好答案应该解释为什么语言是这样设计的。在将链接添加到CppReference
页面时,您击败了我。在您发布和更新您的答案之前,我正在阅读该链接。@FrancisCugler我在阅读完所有内容后仍添加了该链接:)随着时间的推移,我了解到CppReference
确实是一个优秀的资源和存储库,可以作为一个很好的查找表或指南。尝试获得任何帮助吗来自MS的完整信息这是一个完全不同的故事…所有编译器都显示相同的错误。顺便说一句,所以它可能不是一个bug。
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
test.cpp:19:10: error: unable to find numeric literal
operator 'operator""_E+2.0'
^^^^^^
auto x = 1.0_E+2.0; // error