请看以下代码:
constexpr const int A = 42;
const int &B = A;
static_assert(&A == &B, "Bug");
constexpr const int &C = B;
static_assert(&A == &C, "Bug");
int main() { return 0; }
在clang版本3.3中,它是完全被接受的,而g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388则拒绝了该方法,错误提示如下:
bug2.cpp:5:1: error: non-constant condition for static assertion
static_assert(&A == &B, "Bug");
^
bug2.cpp:5:1: error: the value of ‘B’ is not usable in a constant expression
bug2.cpp:2:12: note: ‘B’ was not declared ‘constexpr’
const int &B = A;
^
在我的看法中,GCC是正确的(尽管我更喜欢clang的行为)。尝试阅读标准后,我意识到自己不够成熟,无法做出决定。有人能确认吗?
constexpr
表达式规则变更有关;C++14引入了放宽的constexpr
表达式规则,允许在constexpr
函数中改变状态,因此C++14中的constexpr
不意味着const
(尽管名称很奇怪)。 - Matthieu M.