为什么 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 字符串的副本初始化。构造函数不是显式的,所以从nullptr
到std::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).
由于一个错误,我刚刚发现这段代码在 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 字符串的副本初始化。构造函数不是显式的,所以从nullptr
到std::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, ifs
is a null pointer).