[英]static_assert doesn't recognize a const char* template parameter as constexpr: g++ bug?
请考虑以下定义。
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)))'不是常数表达
我相信这是一个编译器错误,因为根据我作为模板参数传递的内容(无论Test::right_string
还是Test::right_string
), static_assert
表达式的constexpr
性没有意义。
我已经发现在将地址作为模板参数处理时,g ++ 4.6 有点缺陷 。 这是同一错误的实例吗?
这是一个g ++错误,至少已在4.7中修复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.