我有这个功能:
std::string SWindows::PRecv(int rc, std::string* ip);
在这个函数中,在某些情况下我返回NULL并且代码编译(IDE:VS 2012)。 对我来说,NULL它不是std :: string对象所以我们不能写它。
那么为什么在函数返回std :: string时返回NULL是正确的?
答案 0 :(得分:7)
值NULL
相当于C ++中的0
,0
是完全有效的char const*
常量。字符串类有一个非explicit
构造函数取char const*
,即编译器将编译代码但它不起作用:即,虽然编译器排除了代码,但它是未定义的行为。< / p>
查看C ++ 11中的定义我看不到delete
d重载std::nullptr_t
,即从nullptr
转换时它也会编译。我希望有delete
d重载可以使std::nullptr_t
允许编译器捕获这种情况,至少在传递nullptr
时。
答案 1 :(得分:4)
您正在做的是从std::string
构建char const*
等于0
(或NULL
)。
标准实际上禁止这样做:
[C++11: 21.4.2/9]
要求:s
不应为空指针
但是,GCC对您和does checks to make it a no-op非常友好。它不是必须的,你不应该依赖它。