static_assert不能将const char*template参数识别为constexpr:g ++ bug?

Lor*_*one 8 c++ templates static-assert constexpr c++11

考虑以下定义.

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
}
Run Code Online (Sandbox Code Playgroud)

完整的错误是

../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 在处理地址作为模板参数时有些缺陷.这是同一个bug的实例吗?

Lor*_*one 2

这是一个 g++ bug,(至少)在 4.7 中修复了。