8

以下の定義を検討してください。

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_stringTest::right_string

アドレスをテンプレートパラメータとして処理する場合、g++4.6に多少の欠陥があることはすでにわかっています。これは同じバグのインスタンスですか?

4

1 に答える 1

2

これは g++ のバグで、(少なくとも) 4.7 で修正されています。

于 2012-05-02T17:14:37.777 に答える