为什么std::string str(nullptr)
和std::string str=nullptr
是错误的?有人能详细解释一下原因吗?
当您编写std::stringstr
时,您声明了一个字符串。nullptr
是指针值。
因此,如果您有一个字符串指针,则可以执行以下操作:std::string*str(nullptr);
。
但是如果只使用一个直接的std::string
,就没有意义了。
我猜您来自Java或C#,在那里,所有幕后的对象都是暗地里的指针/引用。因此,当您编写StringStr
时,您需要将其初始化为NULL
(或该语言的等效语言)。但是在C++中,没有任何东西是指针,除非您显式地声明它是指针(除非您知道您确实需要一个指针,否则不应该这样做)。
这意味着C++中的std::string
(就像int
或std::vector
或。。。)将始终有一个值。
这样的示例编译是因为存在一个std::string(const char*)
构造函数,用于接受以空结尾的字符串,这是在C中存储字符串的标准版本。此外,数组急切地衰减为指针,以便允许编译诸如std::string(“ahoj”)
这样的代码。
这是错误的,因为构造函数期望一个有效的以空终止的字符串,尽管示例进行了编译,但它的行为是未定义的。
类似地,std::stringstr(0);
也可以工作,但也未定义,因为文字零可以隐式地转换为指针,因为它被用作nullptr
-null
的前C++11版本。
编辑:我最初声称std::logic_error
将被抛出,@François Andrieux纠正了我。