当我用 0 初始化 std::string 时会发生什么?

问题描述 投票:0回答:2

例如,假设我有

std::string str = 0;

0 是否被转换为 const char*?
当它传递给构造函数时,它是否被转换为 char*,然后转换为 const char*?

我知道将 char* 初始化为 0 是未定义的行为,据我所知 const char* 也是如此,但我不明白当我将 0 传递给 std::string 时发生的过程构造函数。
编辑:我错了。

c++
2个回答
4
投票

你的猜测是正确的。

如果我们看看例如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。


1
投票

我知道将 char* 初始化为 0 是未定义的行为

你理解错了。 0 文字可以转换为任何指针类型的空指针常量。那里没有什么未定义的。当涉及重载时,问题就会出现,并且 0 不仅可以转换为指针,还可以转换为另一种整数类型。但这种转换本身并没有问题。

这让我们了解了

std::string str = 0;
的作用。它从0开始初始化类类型
str
。所以我们需要检查构造函数,唯一适用于0的就是这个:

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

所以它确实是从空指针初始化

str
。这就是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.