gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:10:28 25 4
gpt4 key购买 nike

我想弄清楚 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,GCC 甚至没有警告我(即使我启用了 -Wall -Wextra -pedantic)是否应该被视为错误?

最佳答案

Clang 是正确的。引用在常量表达式中被“急切地”求值,可以这么说。 [expr.const]/2.11:

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine, would evaluate one of the following expressions:

  • [...]
  • an id-expression that refers to a variable or data member of reference type unless the reference has a preceding initialization and either
    • it is initialized with a constant expression or
    • its lifetime began within the evaluation of e;
  • [...]

关于c++ - 使用引用的 constexpr 静态成员作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com