考虑以下定义。
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的实例吗?
答案 0 :(得分:2)
这是一个g ++错误,在4.7中修复(至少)。