2017-10-18 9 views
6

nullptrからboolまでのタイプのコードスニペットがあります。細かい作業`bool`型に` nullptr`を割り当てました。どのコンパイラが正しいのですか?

#include <iostream> 

int main() 
{ 
    bool b = nullptr; 
    std::cout << b; 
} 
打ち鳴らすには

3.8.0。出力は0です。 Clang Demo

しかしG ++ 5.4.0はエラーを与える:正しいコンパイラ

source_file.cpp: In function ‘int main()’: 
source_file.cpp:5:18: error: converting to ‘bool’ from ‘std::nullptr_t’ requires direct-initialization [-fpermissive] 
     bool b = nullptr; 

を? C++標準(4.12ブールの変換)から

+0

ですでにこの問題を指摘しました。 "警告:nullptr定数を暗黙的に 'bool'に変換する[-Wnull-conversion]" – UnholySheep

+0

GCC(およびMSVC)と[reference](http://en.cppreference.com/ w/cpp/language/implicit_conversion)標準では許可されていないと言いたいです(そしてClangは拡張機能として許可しています) – UnholySheep

+0

それはうまくいけません。 'nullptr'の全体のポイントの1つは、ブール値のコンテキストでポインタを使用することです。 : - /しかし、少なくともそのような割り当ての形で直接変換について警告するのは正しいかもしれません。コンパイラは 'nullptr'の代わりに' nullptr && true'を指定してもエラーを返しますか? – Omnifarious

答えて

8

1 A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. For direct-initialization (8.5), a prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

だから、この宣言

bool b(nullptr); 

は有効であり、この

bool b = nullptr; 

は間違っています。

私自身は、あなたがリンクされ、ライブコンパイラでそれを実行しているとき、私は、コンパイラの警告を受けるisocpp

+1

C++ 11標準は異なる言い回しを持っています。 https://timsong-cpp.github.io/cppwp/n3337/conv.boolを参照してください。投稿のテキストは、後のバージョンの標準からですか? –

+1

OPが述べたように、なぜclang 3.8.0でうまくいったのですか?万が一、「nullptr」が0であると解釈しましたか? (あまりありそうもない) –

+1

少し欠けていますか?私はそれが "この宣言は正しかった"と思う(最初のスニペットの場合) – UnholySheep

関連する問題