次のコードを3つのコンパイラでテストし、エラー、警告、およびokという3つの異なる結果が得られました。nullptr_tからboolへの変換:有効かどうか?
- GCC(5.3):警告: 'ブール' にnullptr定数の暗黙的な変換エラー: 'CONSTシング&'
- クラン(3.8)への無効なユーザー定義の変換 'のstd :: nullptr_t'
- MSVC(14.1):エラーなし、正しいコンパイラ警告なし
?私はそれがポインタータイプとbool
の間の些細な変換であることを知っています。しかし、std::nullptr_t
とbool
は何ですか?
(最後に、クランとMSVCの両方のコードで微細である。クランが積極的にもう少し冗長である。)
struct Thing
{
Thing(bool) {}
};
void addThing(const Thing&){}
int main()
{
addThing(nullptr); // warning or error on this line
}
ここでは論理的に矛盾していますか? (答えではない)。私はそれが他の理由で強制されたと確信していますが、これは実際には '_cast'演算子がなくてもどちらもうまくいかないケースとして私を襲います。 –
@BrettHale私の解釈は、 'nullptr'は(ポインタ型とメンバ型へのポインタの)nullポインタに暗黙的に変換できるということです。 'bool'への変換は明示的でなければならないが、他のポインタの一貫性のためには許されている。 – songyuanyao
@Brett Hale私はそれが矛盾しているとは思わない。明示的にコンストラクタを呼び出すと、驚きの驚きは、明示的にマークされたコンストラクタを呼び出します。これは、静的キャストが行うことの1つです。これらは基本型なので、文字通りコンストラクタはありませんが、アイデアは同じです。 –