以下の定義を検討してください。
char right_string[]="::right_one.";
char wrong_string[]="::wrong_one.";
template<const char* str>
void f(){
static_assert(str==::right_string, "Pass me ::right_string!");
}
struct Test{
static constexpr char right_string[]="template_struct::right_one";
static constexpr char wrong_string[]="template_struct::wrong_one";
template<const char* str>
static void f(){
static_assert(str==right_string, "Pass me template_struct::right_string!");
}
};
int main(){
f< ::right_string>(); //compiles, as expected
f< ::wrong_string>(); //does not compile, as expected
Test::f<Test::right_string>(); //compiles, as expected
Test::f<Test::wrong_string>(); //error in Test::f: non-constant condition for static assertion
}
完全なエラーは
../main.cpp:16:3:エラー:静的アサーションの条件が一定ではありません
../main.cpp:16:3:エラー:'(((const char *)(&Test :: wrong_string))==((const char *)(&Test :: right_string)))'は定数式
これはコンパイラのバグだと思います。なぜなら、テンプレートパラメータとして渡すもの(または)に応じてconstexpr
、内部の式の性質がstatic_assert
変化することは意味がないからです。Test::right_string
Test::right_string
アドレスをテンプレートパラメータとして処理する場合、g++4.6に多少の欠陥があることはすでにわかっています。これは同じバグのインスタンスですか?