尽管clang编译以下行,但g++ 6.1抱怨数字分隔符(请参见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教程“
<chrono>
教程”中使用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)
,如所需) - Aaron McDaid