質問:は暗黙のブール変換が常にvoid*
に暗黙的な変換を試みるにフォールバックしていますか? (そのような変換関数が型に存在する場合)。もしそうなら、なぜですか?C++では、bool変換は常にvoid *への暗黙的な変換に戻されますか?
は、次の短いプログラムを考えてみましょう:
#include <iostream>
class Foo{
public:
operator void*() const
{
std::cout << "operator void*() const" << std::endl;
return 0;
}
};
int main()
{
Foo f;
if(f)
std::cout << "True" << std::endl;
else
std::cout << "False" << std::endl;
return 0;
}
このプログラムの出力は次のとおりです。
operator void*() const
False
意味、void*
への変換関数が呼び出されました。 explicit
修飾子に変換関数の前にタグを付けると、void*
への暗黙の変換は失敗します。
編集: 多くの答えが「ヌルポインタがfalse
に変換することができます」としているようです。私はこれを理解しています。私の質問は「私が直接operator bool()
に電話できない場合、私はどのポインタにも変換しようとします。えっ、
"任意のポインタへの変換を試みます" - "' void'ポインタではありません任意の "ポインタ。 'void'ポインタは' void'ポインタです。どのような種類のアドレスでも受け付けます。 – xinaiz
@BlackMoses私は、受け入れられた答えを考えると実際にそうであるように見えるポインタ型を意味しました。 – jensa
@JesperJuhlそれは愚かな質問ではありません。これは、コンパイラがこれを行うことが許されているかどうかと、その背後にある推論について尋ねています。あなたにとってはかなりわかりやすいかもしれませんが、初心者から中級の開発者にとっては、これは混乱する可能性があります。ポインタだけでなく、 –