相关疑难解决方法(0)

为什么默认情况下全局命名空间中没有C++ 14标准定义的文字?

C++ 14包括标准定义的文字,其中包括标题中的std::string各种时间跨度<chrono>.

要使用它们,您必须说using namespace std::literals;(或者某些变化取决于您想要的文本,因为它们位于各种内联命名空间中).

这一切都很好,但我很好奇为什么using需要声明.没有前导下划线的UDL保留用于实现,因此"hello world"s在符合标准的程序中不可能有任何其他含义.

那么为什么#include <string>不足以将文字转换功能纳入范围呢?为什么我必须明确包含文字命名空间?

编辑: N3531是我能找到的提案的最新版本 - 不幸的是,它没有讨论将东西放入命名空间的动机,但只说:

可以总结[波特兰]讨论的要求如下:

  • 为一组(相关的)UDL运算符使用内联命名空间

c++ user-defined-literals c++14

20
推荐指数
2
解决办法
3162
查看次数

这两种添加字符串的情况有什么区别?

我注意到,当我初始化一个字符串时,编译器报告了一个我没想到的错误.

例如:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s1 = "Hello", s2 = "World!"; // ok
    string s3 = s1 + ", " + "World!"; // ok
    string s4 = "Hello" + ", " + s2; // error
    cout << s1 + " " + s2 << endl; //ok
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,如果s3工作得很好,也s4应该这样做.

为什么我会收到这个错误?这两个初始化字符串(s3s4)有什么区别?

c++ string c++11

6
推荐指数
3
解决办法
277
查看次数

是否有理由将运算符“”放入std :: literals :: string_literals?

我很惊讶地发现该代码未编译(假设我们使用的是C ++ 14编译器):

std::cout << "hello world!\n"s;
Run Code Online (Sandbox Code Playgroud)

ideone显示的错误如下

找不到字符串文字运算符“ operator””

幸运的是,使用以下using语句修复起来非常简单:

using namespace std::literals::string_literals;
std::cout << "hello world!\n"s; // Compiles!
Run Code Online (Sandbox Code Playgroud)

我想知道是否将标准字符串用户定义的文字放在不同于其std::string本身的名称空间中的原因是什么?我一直在思考,但我不知道原因。

无法与operator""sfrom 冲突,std::chrono因为它们使用不同的类型:

auto ten_seconds = 10s; // ten seconds
auto some_string = "some string"s; // some string
Run Code Online (Sandbox Code Playgroud)

我在想,在resason可能是不会发生冲突与我的用户定义的文字,但该标准说的是我必须用preceed他们'_'下划线

警告:保留不带'_'的文字运算符后缀以供将来标准化

因此,我很惊讶,没有人知道将字符串文字运算符放入std::literals::string_literals?中的原因。

谢谢。

c++ string-literals user-defined-literals c++14

5
推荐指数
0
解决办法
80
查看次数