[英]static_assert doesn't recognize a const char* template parameter as constexpr: g++ bug?
[英]g++ accepts const as constexpr in static_assert
使用g++ 4.8.2
和-std=c++11
标志编译以下代码时,它编译时没有错误:
constexpr double C = 299792.458;
const double local_max = 3.5;
static_assert(local_max < C, "can't go that fast");
编译以下代码时会出错:
constexpr double C = 299792.458;
double x = 3.5;
const double local_max = x;
static_assert(local_max < C, "can't go that fast");
错误信息:
a.cc:在函数'int main()'中:
a.cc:6:2:错误:静态断言的非常数条件
static_assert(local_max <C,“不能那么快”);a.cc:6:2:错误:'local_max'的值在常量表达式中不可用
a.cc:5:15:注意:'local_max'未声明为'constexpr'const double local_max = x;
我的问题是为什么它在第一种情况下不会出错。
是否取决于是否使用constexpr
初始化const
变量?
之后你是完全正确的
const double local_max = 3.5;
local_max
仍然不应该是编译时常量。 这是一个编译器错误,已在GCC 5.1中修复。 您可以在gcc.godbolt.org上验证这一点 ,您将在其中看到GCC的错误消息,包括:
错误:'local_max'的值在常量表达式中不可用
和
注意:'local_max'未被声明为'constexpr'
第一个版本正在运行,因为local_max不会在内存中。 无论何时使用local_max,它都将被替换为它的值,这在编译时是已知的。 所以你可以根据它调用static_assert。
但是,在第二个版本中,local_max基于x得到它的值,它在运行时得到它的值。
您不能基于在运行时获取它的值的变量来创建static_assert,因为static_assert是编译时断言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.