C++ 为什么允许将0或nullptr赋值给std::string,即使它会导致直接的运行时异常?

C++ 为什么允许将0或nullptr赋值给std::string,即使它会导致直接的运行时异常?,c++,c++14,language-lawyer,stdstring,nullptr,C++,C++14,Language Lawyer,Stdstring,Nullptr,上述语句导致分段错误。为什么允许这样做? [至少nullptr的构造函数重载应该是=delete,不是吗?]在这种情况下,由于重载解析的工作方式,调用了const char*的构造函数 如果该指针是nullptr,则标准库将尝试使用未定义的结果取消对空指针值的引用 std::string已经严重膨胀。我猜想没有人能说服C++标准委员会对 STD::String(STD:NulLptrtrt)< /C>构造函数>的优点。 < P>,由于超载解析的方式,调用了 const char */COD>的构

上述语句导致分段错误。为什么允许这样做?

[至少
nullptr
的构造函数重载应该是
=delete
,不是吗?]

在这种情况下,由于重载解析的工作方式,调用了
const char*
的构造函数

如果该指针是
nullptr
,则标准库将尝试使用未定义的结果取消对空指针值的引用


std::string
已经严重膨胀。我猜想没有人能说服C++标准委员会对<代码> STD::String(STD:NulLptrtrt)< /C>构造函数>的优点。

< P>,由于超载解析的方式,调用了<代码> const char */COD>的构造函数。

如果该指针是
nullptr
,则标准库将尝试使用未定义的结果取消对空指针值的引用


std::string
已经严重膨胀。我猜想没有人能说服C++标准委员会对“代码> STD::String(STD:NulpPtrtrt)< /C>构造函数> < /P>…………抛出<代码> STD::LogICHOLL错误< /代码>”——这个尝试的初始化从不抛出,它总是导致UB。@ DFRI“永远不会X”和“总是UB”是互斥的。UB可以有任何行为,因此没有什么是永远不会发生的。@eerorika是的,你是对的,当然(这里有恶魔从我们鼻子里飞出来);但我希望我要强调的重点是,这是UB,而不是以一种定义明确的方式进行投掷,这一点没有被任何人忽视。这个问题有点误导。
std::string s=nullptr是不允许的。C++经常不会阻止你在编译时做一些不允许的事情,也不会阻止你在运行时检查不允许的东西。C++不是保姆语言,它假定源代码是有效的。“………………抛出 STD::LogICHOLL <0/COD>”——这个尝试的初始化从不抛出,它总是导致UB。@ DFRI“永远不会X”和“总是UB”是互斥的。UB可以有任何行为,因此没有什么是永远不会发生的。@eerorika是的,你是对的,当然(这里有恶魔从我们鼻子里飞出来);但我希望我要强调的重点是,这是UB,而不是以一种定义明确的方式进行投掷,这一点没有被任何人忽视。这个问题有点误导。
std::string s=nullptr是不允许的。C++经常不会阻止你在编译时做一些不允许的事情,也不会阻止你在运行时检查不允许的东西。C++不是保姆语言,它假定源代码是有效的。我认为它们有一个很好的理由:这样的构造函数只会捕获在OP中编写的SyrySys.但是它不会捕获类型为
const char*
的空指针值的赋值。
=0
是否也会导致
const char*
构造函数重载?我认为它们有一个很好的理由:这样的构造函数只会捕获OP中编写的错误,但是它不会捕获类型为
const char*
的空指针值的赋值。
=0
是否也会导致
const char*
构造函数重载?
std::string s = 0;  // = nullptr ---> throws `std::logic_error`