繁体   English   中英

使用引用的 constexpr 静态成员作为模板参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM