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

Joh*_*ohn 3 c++ string

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

Qui*_*mby 6

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

这是错误的,因为构造函数需要一个有效的以空字符结尾的字符串,尽管该示例可以编译,但它的行为是未定义的。

同样地std::string str(0);将工作和未定义过因为它被用来作为预C ++ 11版本的字面零隐式转换为指针nullptr- NULL

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

  • 这是未定义的行为。如果实现选择处理这种情况,它可能会抛出“std::logic_error”,但也可能不会。 (3认同)