我已经建立了以下小例子:转换的虚假通过为const char对象*构造
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
的实例。在这种情况下,编译器在调用A(T)
构造函数时将T的值/实例包装在内。
此外,只有一个直接隐式转换是允许的,即,没有链A(B(c))
被插入到一个值c
转换C
类型的,即使构造A(B)
和B(C)
存在。
所以,我的问题:
- 为什么
false
转换为在我的例子指针?当然,一个指针不是一个对象,但是这里仍然有两个隐式转换。什么规则正在应用? - 为什么转换不适用于
true
?我的直觉是,false
可以合理地转换为nullptr
(另请参阅警告),而true
没有有意义的指针值。
那么,有人能解释哪些转换规则适用/不适用于上述两个示例?
您的假设是正确的。所有的零值整数对象(“bool”和“char”都属于)可以隐式转换为“nullptr”。这就是为什么'int * x = 0;'(和'int * x ='\ 0';')有效,但是'int * x = 1;'不。 –
真的好问题! – Destructor