Sil*_*olo 20 c++ string constructor c++11
C++中不同的构造语法总是让我感到困惑.在另一个问题中,有人建议尝试初始化一个字符串
std::string foo{ '\0' };
Run Code Online (Sandbox Code Playgroud)
这有效并产生预期结果:长度为1的字符串仅包含空字符.在测试代码时,我不小心输入了
std::string foo('\0');
Run Code Online (Sandbox Code Playgroud)
这编译很好(即使没有警告-Wall
),但在运行时终止
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
现在,据我所知,没有构造为std::string
接受一个字符作为参数,而这一假设是进一步证实了,当我试图通过间接的角色.
char b = '\0';
std::string a(b);
Run Code Online (Sandbox Code Playgroud)
这会产生一个很好的,冗长的编译错误.就像这样
std::string a('z');
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:什么允许std::string a('\0');
编译,以及它与什么不同std::string a{ '\0' };
?
脚注:g++
在Ubuntu上进行编译.这并没有把我当作编译器错误,但以防万一......
Ron*_*Ron 19
字符'\0'
可隐式转换为整数值,0
从而表示实现定义的空指针常量.这个:
std::string foo('\0');
Run Code Online (Sandbox Code Playgroud)
调用构造函数重载接受类型的指针const char*
作为参数并导致未定义的行为.它等同于传递0
或NULL
:
std::string foo(0); // UB
std::string bar(NULL); // UB
Run Code Online (Sandbox Code Playgroud)
第4和第5个构造函数的引用重载状态:
如果s ...行为是未定义的,包括s是空指针的情况.
第二个声明:
std::string foo{'\0'}; // OK
Run Code Online (Sandbox Code Playgroud)
调用构造函数接受std::initializer_list<char>
作为参数并且不会导致UB.
你可以调用构造函数重载接受数数char
!而非:
std::string s(1, '\0');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1025 次 |
最近记录: |