提问者:小点点

为什么`std::string str(nullptr)`和`std::string str=nullptr`是错误的?有人能详细解释一下原因吗?


为什么std::string str(nullptr)std::string str=nullptr是错误的?有人能详细解释一下原因吗?


共2个答案

匿名用户

当您编写std::stringstr时,您声明了一个字符串。nullptr是指针值。

因此,如果您有一个字符串指针,则可以执行以下操作:std::string*str(nullptr);

但是如果只使用一个直接的std::string,就没有意义了。

我猜您来自Java或C#,在那里,所有幕后的对象都是暗地里的指针/引用。因此,当您编写StringStr时,您需要将其初始化为NULL(或该语言的等效语言)。但是在C++中,没有任何东西是指针,除非您显式地声明它是指针(除非您知道您确实需要一个指针,否则不应该这样做)。

这意味着C++中的std::string(就像intstd::vector或。。。)将始终有一个值。

匿名用户

这样的示例编译是因为存在一个std::string(const char*)构造函数,用于接受以空结尾的字符串,这是在C中存储字符串的标准版本。此外,数组急切地衰减为指针,以便允许编译诸如std::string(“ahoj”)这样的代码。

这是错误的,因为构造函数期望一个有效的以空终止的字符串,尽管示例进行了编译,但它的行为是未定义的。

类似地,std::stringstr(0);也可以工作,但也未定义,因为文字零可以隐式地转换为指针,因为它被用作nullptr-null的前C++11版本。

编辑:我最初声称std::logic_error将被抛出,@François Andrieux纠正了我。