学習プロジェクトとして、私は独自のテンプレートmetaprogramming static_assertを作成しています。私はオンラインでメタプログラミングテクニックを見つけました。コンパイルに失敗するサイズ0の配列を作成しようとしました。だから私は2つのほぼ同じアプローチを使用しています:Visual Studioでは、1つは動作し、もう1つは動作しませんが、違いは何か分かりません。 g ++ 5.4.0では、どちらも動作しません( "-std = C++ 14"フラグでさえも)。何故なの?C++は独自のstatic_assertを実装しています
//This correctly aborts the compile on Visual Studio 2015.
//But on g++ it doesn't work (not even with the "-std=c++14" flag) .
template <bool b>
inline void my_static_assert_function()
{
char member[b]; //if b is false, this is 0-length and fails to compile.
}
//On Visual Studio 2015, this does give a warning, but does not
//abort the compile. Why not? It seems virtually identical to the
//previous one. And on g++, it doesn't even warn.
template <bool b>
struct my_static_assert_struct
{
char member[b]; //if b is false, this *warns* but compiles.
};
int main()
{
my_static_assert_function<1 == 2>(); //This aborts the compile, great.
my_static_assert_struct<1 == 2> c; //This does NOT abort the compile???
}
質問#1 - 「g ++ -std = C++ 14 main.cpp」はなぜ警告なしでもコンパイルできますか? my_static_assert_functionはそこで動作するべきではありませんか?私はubuntuのために5.4.0を使用しています。
質問#2 - Visual Studio 2015では、my_static_assert_functionはコンパイルできませんが、my_static_assert_structは単なる警告でコンパイルされます。しかし、違いは何ですか?他の人がいなければ、どのように働くことができますか?
GCCはトリッキー獣です。正直なコンパイラにするためには、すべてのフラグを実際に学ぶ必要があります。 –
(実際のプログラマが-1の配列を作っているのはこのためです) –
@Kerrek SB:GCCがエクステンションにも理由を見つけるまで。 – AnT