gpt4 book ai didi

c++ - constexpr 对象有没有办法引用/指向其他非静态 constexpr 对象?

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:18 25 4
gpt4 key购买 nike

假设我想在编译时使用某种算法构建一个图,然后计算图中最终有多少个节点。这似乎是 constexpr 的理想情况,而不是模板元编程,因为目标是产生值的计算,而不是真正关于类型的计算。我有一些有效的代码,但该功能太新了,我担心编译器会很宽容,我可以将部分标准解释为说我不能这样做。

#include <iostream>

struct A { int x; constexpr A(int i) noexcept : x{i} {} };
struct B { A& a; constexpr B(A& a) noexcept : a{a} {} };

constexpr int foo() {
A a{55};
B b{a};
return b.a.x;
}

template<int N>
void output()
{
std::cout << N << std::endl;
}

int main() {
// to be absolutely sure compile time eval'd,
// pass as template arg
constexpr auto b = foo();
output<b>();
}

ab 实例都是在编译时创建的,并且它们具有相同的生命周期,因此这应该是“安全的”。但是 a 是一个非静态对象,并且 this part of the standard似乎说这是不允许的:

An entity is a permitted result of a constant expression if it is an object with static storage duration that is either not a temporary object or is a temporary object whose value satisfies the above constraints, or it is a function.

那么我可以还是不能? GCC and clang are both fine with it.

最佳答案

是的,您的示例符合要求。

C++14 relaxed constexpr 的特别之处在于常量表达式求值中的中间结果本身不需要是常量表达式。

return 将左值到右值转换应用于 b.a.x,因为该函数按值返回,而 b.a.x 是:

a non-volatile glvalue of literal type that refers to a non-volatile object whose lifetime began within the evaluation of e

(N4527 §5.20/2.7.4)

如果您尝试将(悬垂的)引用保存到 b.a.x,那将是一个问题。根据您的报价,这不是“常量表达式的允许结果”。

关于c++ - constexpr 对象有没有办法引用/指向其他非静态 constexpr 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735037/

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