[英]Using a constexpr static member of a reference as template argument
我试图弄清楚 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
}
我不知道这是为什么。 显然, bb
是一个有效的 constexpr (或者第一个Foo<bb>
将无效)。 br.b
不是有效的 constexpr 吗? 为什么? 对象或引用本身应该与它无关,因为我们在这里访问的是静态 constexpr 成员,对吗?
如果这真的不是有效的 C++17,那么 GCC 甚至没有警告我的事实(即使我启用了-Wall -Wextra -pedantic
)是否应该被视为错误?
叮当是对的。 可以这么说,引用在常量表达式中被“热切地”评估。 [expr.const]/2.11:
表达式
e
是核心常量表达式,除非按照抽象机器的规则对 e 求值会求值以下表达式之一:
- [...]
- 引用变量或引用类型数据成员的id 表达式,除非该引用具有前面的初始化并且
- 它用常量表达式初始化或
- 它的生命周期从
e
的求值开始;- [...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.