対打ち鳴らすの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で何か変わったのですか?
、VS 2015でコンパイル:ここ
は、いくつかのバグ(直接の関連はありません)似たようなケースでのレポートですそれだけでいいです – Rakete1111
明らかにバグです。 C++ 1zでは非型のテンプレート引数に制約が緩和されているため、おそらく別のコードパス(バグを引き起こさない)が使用されます。 –
それは明らかにヌルポインタのように扱われています:http://coliru.stacked-crooked.com/a/966a61826b6d73f9。これは正常な動作ではありません。 –