gpt4 book ai didi

c++ - 非 constexpr 变量有时可用于 constexpr 上下文?

转载 作者:行者123 更新时间:2023-12-01 14:48:50 27 4
gpt4 key购买 nike

看看下面的代码示例:

template<bool val>
struct test {
static const int value_a = val;
const int value_b = val;
constexpr int get_value_a() const noexcept { return value_a; }
constexpr int get_value_b() const noexcept { return value_b; }
};


int main(int argc, char** argv) {
auto t = test<true>{};
static_assert(t.value_a);
// static_assert(t.value_b);
static_assert(t.get_value_a());
// static_assert(t.get_value_b());
}
gcc 和 clang 都同意这应该编译,但包括任何注释掉的静态断言都会使其无效。例如,gcc 然后会产生这些错误信息:

error: non-constant condition for static assertion

error: the value of ‘t’ is not usable in a constant expression

note: ‘t’ was not declared ‘constexpr’


这对我来说非常有意义,而且正是我所想的。但我真的不知道为什么其他两个静态断言首先编译。标准中允许这样做的相关段落是什么?
特别是,这是如何形式化的?仅使用变量与实际访问其运行时值(这将是 constexpr 上下文中唯一禁止的事情)之间是否存在明确定义的区别?

最佳答案

In particular, how is this formalized?



http://eel.is/c++draft/expr.const#4.1

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine ([intro.execution]), would evaluate one of the following:

this ([expr.prim.this]), except in a constexpr function ([dcl.constexpr]) that is being evaluated as part of e;



访问非静态成员评估 this指针。访问静态成员不会。

关于c++ - 非 constexpr 变量有时可用于 constexpr 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59914631/

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