Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么用户定义的字符串文字和整数文字有不同的行为?_C++_C++11_User Defined Literals - Fatal编程技术网

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