例如,假设我有
std::string str = 0;
0是否被转换为const char *?
它被转换为char *,然后转换为const char *,当它被传递给构造函数时?
我知道将char *初始化为0是未定义的行为,据我所知,const char *也是如此,但我不了解正在进行的过程当我将0传递给std :: string构造函数时。
编辑:我错了。
答案 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
。这就是未定义的。