我有这个功能:
std::string SWindows::PRecv(int rc, std::string* ip);
在这个函数中,在某些情况下我返回 NULL 并且代码编译(IDE:VS 2012)。对我来说,NULL 它不是一个 std::string 对象,所以我们不能这样写。
那么为什么当函数的返回是 std::string 时返回 NULL 是正确的呢?
该值NULL
等同0
于 C++ 中的值,并且0
是一个完全有效的char const*
常量。string 类有一个非explicit
构造函数char const*
,即编译器将编译代码但它不起作用:也就是说,尽管编译器排除了代码,但它是未定义的行为。
查看 C++11 中的定义,我没有看到delete
d 重载采用 a std::nullptr_t
,即从 a 转换时它也会编译nullptr
。我本来希望有一个delete
d 重载采用 a std::nullptr_t
,这将允许编译器捕捉这种情况,至少在传递nullptr
.
您正在做的是std::string
从char const*
等于0
(或NULL
)构造 a 。
这实际上是标准禁止的:
[C++11: 21.4.2/9]
要求:s
不得为空指针
但是,GCC 对您非常友好,并且会进行检查以使其成为 no-op。它不是必需的,你也不应该依赖它。