首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么用户定义的字符串文字和整数字面值有不同的行为?

为什么用户定义的字符串文字和整数字面值有不同的行为?
EN

Stack Overflow用户
提问于 2017-11-24 06:10:05
回答 1查看 3.8K关注 0票数 24

我正在学习用户定义的文字,并与以下测试代码混淆:

代码语言:javascript
复制
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作为用户定义的文字。此外,浮点文字的行为类似于整数文字.

为什么用户定义的整数文字和字符串文字有不同的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-24 06:24:33

这就是浮点文本的工作方式!!

添加一对括号,它应该有效:

代码语言:javascript
复制
std::cout << (4_s).count();

或者,将它们分开(以阻止编译器将其解释为格式错误的分式常量浮点文字):

代码语言:javascript
复制
std::cout << 4_s .count();
//              ^ Space here!

参考资料:CppReference.com

在上面引用的Notes部分中,

由于最大munch,用户定义的整数和浮点文本以pP、(自C++17) eE结尾,当后面跟着操作符+-时,必须与源中的空格分隔: 长双运算符_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中测试了上面的示例,得到了非常类似的错误消息:

代码语言:javascript
复制
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-后缀的。

我最初的解释尝试可以在这篇文章的修订史中找到。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47467296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档