我正在尝试弄清楚GCC或Clang是否在这里有不同/错误地解释了C++17标准。
这是我的代码,使用GCC 8编译,但不能使用Clang 6编译:
struct BoolHolder {
constexpr static bool b = true;
};
template<bool b>
class Foo {};
int main() {
BoolHolder b;
Foo<b.b> f; // Works
BoolHolder & br = b;
Foo<br.b> f2; // Doesn't work
}
我不明白为什么会这样。显然,
b.b
是一个有效的 constexpr(否则第一个 Foo<b.b>
就无效了)。br.b
不是一个有效的 constexpr 吗?为什么?对象或引用本身与此无关,因为我们在这里访问的是静态 constexpr 成员,对吧?如果这确实不是有效的 C++17 代码,那么即使我启用了
-Wall -Wextra -pedantic
,GCC 也没有警告我,这是否应该被视为一个错误?
constexpr int f(int) { return 0; }
,对于int x
,f(x)
是否会成为constexpr
?https://dev59.com/aafja4cB1Zd3GeqPuVl4 - Evgbr
不是constexpr,所以基于br
的所有东西也不是constexpr。或许作为解决方法,你可以使用BoolHolder::b
,如果BoolHolder
在此上下文中不是常量,那么你可以使用decltype
。 - Marcel