std::string s = 0; // = nullptr ---> throws `std::logic_error`
上述语句导致分割错误。为什么是允许的?
至少nullptr
的构造函数重载应该是=delete
,不是吗?
发布于 2020-06-05 11:19:53
在这种情况下,由于重载解析的工作方式,调用const char*
的构造函数。
如果该指针是nullptr
,那么标准库尝试取消引用一个空指针值,结果没有定义。
std::string
已经极度臃肿了。我的猜测是,没有人能够说服C++标准委员会拥有一个std::string(std::nullptr_t)
构造函数的优点。
发布于 2022-07-06 09:30:03
对于即将到来的C++23,已经提出要防止将nullptr/NULL/0
显式分配给std::string
和std::string_view
。
A Proposal to Prohibit std::basic_string
and std::basic_string_view
construction from nullptr
.
虽然在实践中可能不使用string s = nullptr
,但有时会在泛型代码中无意中触发它。例如:
template<typename T>
struct X {
...
T t = 0;
...
};
X<int> xi; // ok
X<float> xf; // ok
X<string> xs; // c++20 = runtime assert? --- c++23 = compiler error!
https://stackoverflow.com/questions/62214089
复制相似问题