返回NULL而不是std :: string C++

Bob*_*Bob 8 c++ return

我有这个功能:

std::string SWindows::PRecv(int rc, std::string* ip);
Run Code Online (Sandbox Code Playgroud)

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

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

Die*_*ühl 7

该值NULL与0C++相同,0是一个完全有效的char const*常量.字符串类有一个非explicit构造函数char const*,即编译器将编译代码但它不起作用:即,虽然编译器排除了代码,但它是未定义的行为.

看一下C++ 11中的定义,我没有看到deleted重载占用a std::nullptr_t,也就是说,它也会在从a转换时编译nullptr.我本来希望有一个deleted重载std::nullptr_t可以让编译器捕获这种情况,至少在传递时nullptr.

  • 嗯,为什么有人会这样做呢?还有两个人?我很想知道你在哪里不同意@Dietmar,因为你错了(无论你是谁). (2认同)

Lig*_*ica 5

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

这实际上是标准所禁止的:

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

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