c – 为什么可以将nullptr分配给std :: string?
发布时间:2020-12-16 04:56:01 所属栏目:百科 来源:网络整理
导读:所以今天我写了一个相当难以找到的bug,我将std :: string初始化为nullptr(不是指向std :: string的指针,而是值本身).我发现它显然只能在C 11或更高版本中使用clang. #include string#include iostreamusing namespace std;class Meh{ int x;};class Foo{priv
所以今天我写了一个相当难以找到的bug,我将std :: string初始化为nullptr(不是指向std :: string的指针,而是值本身).我发现它显然只能在C 11或更高版本中使用clang.
#include <string> #include <iostream> using namespace std; class Meh{ int x; }; class Foo { private: std::string x=nullptr; Meh y=nullptr; //remove this line and it compiles public: std::string z=nullptr; }; int main(void) { Foo f; cout << f.z; return 0; } 正如您所看到的,我尝试将nullptr分配给一个类的随机实例,但它不起作用.字符串中有什么神奇之处可以让它工作,这种语法甚至是有效的?我假设在这种情况下我会遇到类型转换错误. 作为参考,我用这个编译: clang++ test.cpp -O3 -g -fno-inline -std=c++11 -Wall 它没有给出任何形式的警告,但如果不使用C 11则会出错 解决方法
这只是因为
std::string 中有
constructors(链接中的数字(5))和0700(链接中的数字(3)),因为
std::string 接受了一个const char *,因此nullptr匹配.
在C 11之前(因此在nullptr之前),当您尝试从0或NULL构造时,会出现同样的问题.所有这些情况都是非法的并导致未定义的行为,尽管过去至少有一个STL(RogueWave?)接受它并生成一个空字符串. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |