我已經建立了以下小例子:轉換的虛假通過爲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