【问题标题】:Clang 3.1 and user defined literalsClang 3.1 和用户定义的文字
【发布时间】:2012-06-09 00:31:03
【问题描述】:

Clang 3.1 声称支持用户定义的文字。我可以这样定义:

int operator"" _tryit(long double n) { return int(n); }

但是当我尝试使用它时出现错误:

int m = 5_tryit;

整数常量上的无效后缀'_tryit'

【问题讨论】:

  • int m = 5.0_tryit; 怎么样?
  • 抱歉,如果我侮辱了你的智力,但是……这看起来像是我在 C++03 模式而不是 C++11 模式下编译时遇到的错误,或者当我使用 clang-3.0 时而不是 3.1,不像我在 3.1 的 C++11 模式下滥用后缀时遇到的任何错误。您确定您使用的是正确的版本和 -std 标志吗?

标签: c++ xcode4 c++11 clang


【解决方案1】:

5 在您的情况下不能隐式转换为 long double。您需要将其更改为 5.0 以使其成为 long double 或自己显式调用该函数以使隐式转换起作用:

int m = 5.0_tryit;

int n = operator"" _tryit(5);

(均使用clang version 3.1 (trunk) (llvm/trunk 155821) 测试)

This SO question对规则有很好的解释。

(另外,正如 abarnert 所提到的,确保在编译时将 -std=c++11 标志传递给编译器)。

【讨论】:

  • @John:我刚刚用 clang 3.1 测试了int m = 5.0_tryit;,它对我有用。
  • 来自 Clang 的内容与 Apple 发布的内容之间是否存在版本控制脱节?即,我认为 Apple 所称的“Clang 3.1”与 Clang 所称的“Clang 3.1”不同。参考文献this answer 上的 cmets。
  • Apple 的 Xcode 4.3.2 版本与您使用 llvm.org 的官方 llvm-3.1 版本不太一样,当然两者都与 Jesse Good 中列出的 llvm/trunk 155821 不一样上面回答。但是 Xcode 4.3.2 版本和 MacPorts clang-3.1 版本似乎与 Jesse Good 发布的行为相同,因此这里的差异显然不相关。
  • 感谢您的帮助。有没有人用 Xcode 4.4(开发者预览版)的它声称是 Clang 3.1 的版本测试过“5.0_tryit”?
  • @John:你是否通过了编译器标志(-std=c++11)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多