2016-05-18 4 views
14

対打ち鳴らすのC++ 14には、次のコードを考えてみましょう:-std=c++11または-std=c++14と打ち鳴らす3.8.0でコンパイルする場合が再解釈は、テンプレート非型パラメータをキャスト:C++ 1Z

template <int* > struct foo { }; 

int main() { 
    foo<(int*)42> f; 
    (void)f; 
} 

を、プログラムがコンパイルされます。 -std=c++1z、そのエラーでコンパイルする場合:

main.cpp:4:9: error: non-type template argument is not a constant expression 
    foo<(int*)42> f; 
     ^~~~~~~~ 

のgcc 5.3.0は関係なく、私が正しいと信じているC++モードのコードをコンパイルしません。 C++ 14とC++ 1zの間の違いは何ですか?なぜコードを受け入れますか?ここで関連するC++ 1zで何か変わったのですか?

+1

、VS 2015でコンパイル:ここ

は、いくつかのバグ(直接の関連はありません)似たようなケースでのレポートですそれだけでいいです – Rakete1111

+1

明らかにバグです。 C++ 1zでは非型のテンプレート引数に制約が緩和されているため、おそらく別のコードパス(バグを引き起こさない)が使用されます。 –

+4

それは明らかにヌルポインタのように扱われています:http://coliru.stacked-crooked.com/a/966a61826b6d73f9。これは正常な動作ではありません。 –

答えて

2

godboltを使用すると、-std=c++1zモードでは、Clang 3.5.1はコードを受け入れますが、3.6.0はそれを拒否します。 changelogは、このバージョンがC++ 1z機能のサポートが追加されたとき、つまり「すべての非型テンプレート引数の定数評価」が追加されたことを示しています。私の推測では、C++ 11zとC++ 14モードはC++ 11zルールを使用し、C++ 1zモードはC++ 1z /最新のドラフトルールを使用しています。もちろん、プログラムがC++ 11/14モードで有効とみなされるという事実は、それ自体のバグです。サイドノートとして

Bug 18043 - allow arbitrary address constant expressions as non-type template arguments as an extension

Bug 10398 - Clang won't accept a null pointer constant as a non-type template argument

Bug 10396 - clang crashes during name mangling with as non-type template parameter

Bug 9700 - Null pointer not accepted as non-type template argument

関連する問題