gpt4 book ai didi

c++ - 通过 const char * 构造函数将 false 转换为对象

转载 作者:太空狗 更新时间:2023-10-29 20:10:46 26 4
gpt4 key购买 nike

我构建了以下最小示例:

class A
{
public:
A(const char *s);

private:
const char *p;
};

A::A(const char *s)
: p(s)
{
}

A foo()
{
return false;
}

A bar()
{
return true;
}

使用 g++ (Debian 4.7.2-5) 4.7.2 编译我得到以下信息:

t.cc: In function 'A foo()':
t.cc:17:10: warning: converting 'false' to pointer type for argument 1 of 'A::A(const char*)' [-Wconversion-null]
t.cc: In function 'A bar()':
t.cc:23:10: error: could not convert 'true' from 'bool' to 'A'

据我所知,如果 A 类有构造函数 A(T)。在这种情况下,T 的值/实例由编译器包装在对 A(T) 构造函数的调用中。

此外,只允许一种直接隐式转换,即不插入链 A(B(c)) 来转换 C 类型的值 c ,即使构造函数 A(B)B(C) 存在。

所以,我的问题:

  1. 为什么在我的示例中 false 转换为指针?当然,指针不是对象,但是这里还是有两个隐式转换。适用的规则是什么?
  2. 为什么转换不适用于 true?我的直觉是 false 可以合理地转换为 nullptr(另请参阅警告),而 true 没有有意义的指针值。

那么,有人可以解释一下哪些转换规则适用于/不适用于上述两个示例吗?

最佳答案

如已发布,C++ 11 具有规则“计算为 0 的整数类型的整型常量表达式 prvalue 可以转换为任何指针类型,产生该类型的空指针值。” (C++98/03 有一个措辞类似的规则,具有相同的净效果)。

bool 是整数类型,false 的计算结果为 0。所以 false 是一个有效的空指针常量。

除此额外规则外,C++ 没有从整数类型到指针的隐式转换。这就是为什么 true 不能隐式转换为指针的原因。

但是,C++14 更改了空指针常量的定义,因此只有整数文字(而不是整型常量表达式)符合条件。 false 是 bool 值,不是整数,因此在 C++14 下,代码将无法编译。

此外,由于该问题被标准委员会认定为 C++11 中的缺陷,较新的 C++11 编译器可能会在这方面遵守 C++14 规则,而不会将 false 作为空指针常量。感谢@Destructor用于追踪 issue status .


至于为什么这里似乎允许两次隐式转换:规则不是“最多允许一次隐式转换”。规则是“最多允许一个用户定义的转换”。指针转换(例如将空指针常量转换为空指针值)不属于用户定义的转换。因此,您的情况下的转换顺序是指针转换(boolconst char *),然后是用户定义的转换(const char *A)。

关于c++ - 通过 const char * 构造函数将 false 转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37214420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com