例如,假设我有
std::string str = 0;
0 是否被转换为 const char*?
当它传递给构造函数时,它是否被转换为 char*,然后转换为 const char*?
我知道将 char* 初始化为 0 是未定义的行为,据我所知 const char* 也是如此,但我不明白当我将 0 传递给 std::string 时发生的过程构造函数。
编辑:我错了。
你的猜测是正确的。
如果我们看看例如this
std::string
构造函数参考 我们可以看到,唯一合适的构造函数就是这个:
basic_string( const CharT* s, const Allocator& alloc = Allocator() );
因此你的定义等于
std::string str = std::string(0);
正如参考文献中所述:
如果 [
,s
) 不是有效范围(例如,如果s + Traits::length(s)
是空指针),则行为未定义。s
[强调我的]
所以是的,它从空指针构造了一个
std::string
,这确实是 UB。
我知道将 char* 初始化为 0 是未定义的行为
你理解错了。 0 文字可以转换为任何指针类型的空指针常量。那里没有什么未定义的。当涉及重载时,问题就会出现,并且 0 不仅可以转换为指针,还可以转换为另一种整数类型。但这种转换本身并没有问题。
这让我们了解了
std::string str = 0;
的作用。它从0开始初始化类类型str
。所以我们需要检查构造函数,唯一适用于0的就是这个:
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
所以它确实是从空指针初始化
str
。这就是未定义的。