我有这个功能:
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 中的定义,我没有看到deleted 重载采用 a std::nullptr_t,即从 a 转换时它也会编译nullptr。我本来希望有一个deleted 重载采用 a std::nullptr_t,这将允许编译器捕捉这种情况,至少在传递nullptr.
您正在做的是std::string从char const*等于0(或NULL)构造 a 。
这实际上是标准禁止的:
[C++11: 21.4.2/9]要求:s不得为空指针
但是,GCC 对您非常友好,并且会进行检查以使其成为 no-op。它不是必需的,你也不应该依赖它。