当clang编译以下代码时,g ++ 6.1会抱怨数字分隔符(请参阅Coliru上的实例 ): auto time = 01'23s; 哪个编译器(如果有的话)根据C ++ 14标准(N3796)是正确的? 否则,允许数字分隔符(§2.14.2)只是<chrono> chrono <chrono>库(§20.12.5.8)的用户定义文字(§2.14.8)中的实现细节? 恕我直言,它应该不是,因为这些文字是在unsigned long long参数上定义的。 我记得霍华德· 10'000s (Howard 10'000s在他的2016年CppCon演讲“A <chrono>年代<chrono>教程” (约42分钟的演讲)中以10'000s为例。 (请注意,我并不打算编码“1分23秒”,这只是偶然的 ,因为八进制文字0123是64 + 16 + 3 == 83。为了这个目的,我应该写 auto time = 1min + 23s; 但是这种可能的误导性解释不是问题的一部分。)
SO文档中的string主题在备注部分用来说: 因为C ++ 14不是使用"foo" ,所以推荐使用"foo"s ,因为s是一个string,将const char * "foo"为std::string "foo" 。 我看到的唯一优势 std::string str = "foo"s; 代替 std::string str = "foo"; 在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造函数调用要快。 尽pipe如此,(尚未)保证,所以第一个也可能调用构造函数,复制构造函数。 忽略需要使用std::string文字的情况 std::string str = "Hello "s + "World!"s; 使用std::string文字而不是const char[]文字有什么好处吗?
在C ++编译期间能够创build和操作string有几个有用的应用程序。 尽pipe可以在C ++中创build编译时string,但是这个过程非常麻烦,因为string需要被声明为可变字符序列,例如 using str = sequence<'H', 'e', 'l', 'l', 'o', ', ', 'w', 'o', 'r', 'l', 'd', '!'>; 诸如string连接,子串提取等许多操作可以很容易地实现为对字符序列的操作。 是否可以更方便地声明编译时string? 如果不是的话,有没有一个scheme可以方便的声明编译时间string? 为什么现有的方法失败 理想情况下,我们希望能够声明编译时间string如下: // Approach 1 using str1 = sequence<"Hello, world!">; 或者,使用用户定义的文字, // Approach 2 constexpr auto str2 = "Hello, world!"_s; decltype(str2)将有一个constexpr构造函数。 方法1的一个更复杂的版本可以实现,利用这个事实,你可以做到以下几点: template <unsigned Size, const char Array[Size]> struct foo; 然而,数组需要有外部链接,所以为了让方法1工作,我们必须写这样的东西: /* […]
C ++ 11引入了用户定义的文字 ,它将允许基于现有文字( int , hex , string , float )引入新的文字语法,以便任何types都能够具有文字表示。 例子: // imaginary numbers std::complex<long double> operator "" _i(long double d) // cooked form { return std::complex<long double>(0, d); } auto val = 3.14_i; // val = complex<long double>(0, 3.14) // binary values int operator "" _B(const char*); // raw form int answer […]