使用0初始化std :: string时发生了什么?

时间:2018-02-01 06:59:49

标签: c++

例如,假设我有     std::string str = 0;

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

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

2 个答案:

答案 0 :(得分:2)

你的猜测是正确的。

如果我们看一下,例如this std::string constructor reference我们可以看到唯一合适的构造函数是数字5.因此,您的定义等于

std::string str = std::string(0);

如参考文献中所述:

  

如果s没有指向CharT的至少Traits::length(s)+1个元素的数组,则行为是未定义的,包括s是空指针的情况

[强调我的]

所以它是从空指针构造一个std::string,它确实是UB。

答案 1 :(得分:1)

  

我理解将char *初始化为0是未定义的行为

你理解错了。 0字面值可以转换为任何指针类型的空指针常量。那里没有任何不确定的东西。当涉及到超载时会出现问题,并且0不仅可以转换为指针,还可以转换为另一种整数类型。但这种转换本身并不存在问题。

这使我们了解std::string str = 0;的作用。它从0开始初始化str一个类类型。所以我们需要检查constructors,0中唯一适用的是这一个:

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

所以它确实从空指针初始化str。这就是未定义的。