首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么允许将0或nullptr赋值给std::string,即使它会导致一个直接的前向运行时异常?

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

Stack Overflow用户
提问于 2020-06-05 11:17:08
回答 2查看 223关注 0票数 1
代码语言:javascript
运行
复制
std::string s = 0;  // = nullptr ---> throws `std::logic_error`

上述语句导致分割错误。为什么是允许的?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-05 11:19:53

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

如果该指针是nullptr,那么标准库尝试取消引用一个空指针值,结果没有定义。

std::string已经极度臃肿了。我的猜测是,没有人能够说服C++标准委员会拥有一个std::string(std::nullptr_t)构造函数的优点。

票数 3
EN

Stack Overflow用户

发布于 2022-07-06 09:30:03

对于即将到来的C++23,已经提出要防止将nullptr/NULL/0显式分配给std::stringstd::string_view

A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr.

虽然在实践中可能不使用string s = nullptr,但有时会在泛型代码中无意中触发它。例如:

代码语言:javascript
运行
复制
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!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62214089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档