static_assert不会将const char *模板参数识别为constexpr:g ++ bug?

时间:2012-05-01 23:39:08

标签: c++ templates c++11 constexpr static-assert

考虑以下定义。

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 *)(&amp; Test :: wrong_string))==((const char *)(&amp; Test :: right_string)) )'不是一个常数表达式

我认为这是一个编译器错误,因为constexpr中表达式的static_assert根据我作为模板参数传递的内容(无论Test::right_string更改都没有意义。 1}}或Test::right_string)。

我在处理地址作为模板参数时已经发现g ++ 4.6是somewhat flawed。这是同一个bug的实例吗?

1 个答案:

答案 0 :(得分:2)

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