【发布时间】:2018-12-05 18:55:36
【问题描述】:
在 C++17 中,是否允许在 constexpr 函数中修改全局变量?
#include <iostream>
int global = 0;
constexpr int Foo(bool arg) {
if (arg) {
return 1;
}
return global++;
}
int main() {
std::cout << global;
Foo(true);
std::cout << global;
Foo(false);
std::cout << global;
}
我不希望你能做到,但 clang 6 允许它:https://godbolt.org/g/UB8iK2
但是,GCC 没有:https://godbolt.org/g/ykAJMA
哪个编译器是正确的?
【问题讨论】:
-
@AnT • 我需要一个备忘单来保持 C++11、C++14 和 C++17 的约束。
-
如果您强制编译时评估
constexpr int a = Foo(false),则两者都不起作用,但我不确定哪个(如果有的话)不正确。 -
对我来说这似乎是 gcc 中的一个基本错误
-
肯定是gcc bug,提交86327
-
有趣的是,clang 不允许将函数作为常量表达式评估为修改
global的分支上的常量表达式(如 @user975989 所述),如果您删除if (arg) return 1;分支将无法编译,尽管仍然满足@codekaiser 的答案中列出的要求。
标签: c++ language-lawyer c++17 constexpr