8

我有这个功能:

std::string SWindows::PRecv(int rc, std::string* ip);

在这个函数中,在某些情况下我返回 NULL 并且代码编译(IDE:VS 2012)。对我来说,NULL 它不是一个 std::string 对象,所以我们不能这样写。

那么为什么当函数的返回是 std::string 时返回 NULL 是正确的呢?

4

2 回答 2

7

该值NULL等同0于 C++ 中的值,并且0是一个完全有效的char const*常量。string 类有一个非explicit构造函数char const*,即编译器将编译代码但它不起作用:也就是说,尽管编译器排除了代码,但它是未定义的行为。

查看 C++11 中的定义,我没有看到deleted 重载采用 a std::nullptr_t,即从 a 转换时它也会编译nullptr。我本来希望有一个deleted 重载采用 a std::nullptr_t,这将允许编译器捕捉这种情况,至少在传递nullptr.

于 2013-11-07T20:30:33.577 回答
4

您正在做的是std::stringchar const*等于0(或NULL)构造 a 。

这实际上是标准禁止的:

[C++11: 21.4.2/9]要求:s不得为空指针

但是,GCC 对您非常友好,并且会进行检查以使其成为 no-op。它不是必需的,你也不应该依赖它。

于 2013-11-07T20:30:56.450 回答