为什么 return nullptr 作为 std::string 不是编译时错误?

Why isn't it a compile-time error to return a nullptr as a std::string?

由于一个错误,我刚刚发现这段代码在 Visual Studio 17 上编译得很好,可能在其他编译器上也可以。现在我很好奇为什么?

#include <iostream>
#include <string>

std::string foo(){
    return nullptr;
}

int main(){
    auto s = foo();
    std::cout << s << std::endl;
}

我可以想象这是因为 std::basic_string c'tor 可以用 char* 调用并且在返回从 ptr 到 std::string 的隐式转换时发生(NULL 作为参数,然后发出噗的声响)。我走的路对吗?

为什么不能编译? std::string 具有以下构造函数:

string(const CharT* s, const Allocator& alloc = Allocator());

构造字符串,其内容由 s 指向的 null-terminated 字符串的副本初始化。构造函数不是显式的,所以从nullptrstd::string的隐式转换确实是可能的。

是的,你的假设是对的,检查std::basic_string constructors #5会被调用:

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

请注意,传递 nullptr 会调用未定义的行为,如 the standard 和注释中所述:

The behavior is undefined if [s, s + Traits::length(s)) is not a valid range (for example, if s is a null pointer).