为什么可以将NULLPTR分配给STD :: String

Why can you assign nullptr to std::string?

本文关键字:STD 分配 String NULLPTR 为什么      更新时间:2023-10-16

所以今天我写了一个很难找到错误的错误,其中我将std ::字符串初始化为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接受const char*的构造函数(链接中的数字(5))和分配运算符(链接中的数字(3)),因此nullptr匹配。

在C 11之前(因此在nullptr之前),当您尝试从0NULL构造时,也会发生同样的问题。所有这些情况都是非法的,导致不确定的行为,尽管过去至少有一个STL(Roguewave?)接受了它并产生了一个空字符串。