【发布时间】:2017-03-08 19:36:26
【问题描述】:
当 clang 编译以下行时,g++ 6.1 抱怨数字分隔符(参见 live example on Coliru):
auto time = 01'23s;
根据 C++14 标准 (N3796),哪个编译器(如果有)是正确的?
否则,是否允许数字分隔符(第 2.14.2 节)只是 <chrono> 库(第 20.12.5.8 节)的用户定义文字(第 2.14.8 节)中的一个实现细节?恕我直言不应该,因为这些文字是在 unsigned long long 参数上定义的。
我记得 Howard Hinnant 在他的 CppCon 2016 talk "A <chrono> tutorial" 中以 10'000s 为例(在他的演讲中大约 42 分钟)。
(请注意,我不打算编码“1 分 23 秒”,这只是偶然正确,因为八进制文字 0123 是 64 + 16 + 3 == 83 . 为此我应该写
auto time = 1min + 23s;
但可能的误导性解释不是问题的一部分。)
【问题讨论】:
-
这似乎是一个库错误,应该报告。我有限的实验表明
libstdc++定义了错误类型的文字运算符,采用模板非类型参数template<char ... _Digits>而不是unsigned long long。但这不是标准所要求的,而且这样做是错误的。他们遗漏了operator""s(unsigned long long)运算符,我认为这是基本的潜在问题。 (他们确实有operator""s(long double),根据需要) -
错误报告在这里:gcc.gnu.org/bugzilla/show_bug.cgi?id=69905(其他人发布了此链接,然后删除了他们的评论,但我认为这是正确的链接!)
-
@Aaron McDaid:我删除了该评论,将其包含在我自己的答案中(见下文)。
标签: c++ c++14 language-lawyer user-defined-literals digit-separator