gpt4 book ai didi

c++ - consteval 函数返回具有非平凡 constexpr 析构函数的对象

转载 作者:行者123 更新时间:2023-12-02 03:18:45 26 4
gpt4 key购买 nike

C++20 将有新的 consteval关键字和constexpr destructor如果一切顺利。遗憾的是,据我所知,没有编译器实现 consteval此时。下面的代码有效吗?

struct A {
constexpr ~A() {}
};

consteval A f() {
return A{};
}

void test() {
A a;
a = f(); // <-- here
}

问题来 self 标记的那一行 - 需要调用 f 返回的临时 A 的析构函数。但应该在完整表达式的末尾调用它。所以在立即评估之外。

我没有找到 consteval 的任何引用和 constexpr destructor论文明确禁止这样做,但我不明白它怎么可能是正确的。

以下代码在 C++20 中有效吗?这段代码会发生什么?

<小时/>

注意:

consteval paper ,给出了这个例子。这里 consteval 函数是在常量上下文之外调用的。

consteval int sqr(int n) {
return n*n;
}
constexpr int r = sqr(100); // Okay.
int x = 100;
int r2 = sqr(x); // Error: Call does not produce a constant.

最佳答案

我认为这段代码很好。

consteval 的显着特点是 [expr.const]/12 :

An expression or conversion is in an immediate function context if it is potentially evaluated and its innermost non-block scope is a function parameter scope of an immediate function. An expression or conversion is an immediate invocation if it is an explicit or implicit invocation of an immediate function and is not in an immediate function context. An immediate invocation shall be a constant expression.

void test() {
A a;
a = f(); // <-- here
}

f() 是一个立即调用(它是对不在立即函数上下文中的立即函数的显式调用)。因此要求 f() 必须是常量表达式。

注意:只是f(),而不是a = f();,这里不要求赋值运算符是常量表达式。

f() 调用的一切都很好。 A 的所有特殊成员函数都可以在恒定求值时间内调用。 f() 的结果是常量表达式 ( [expr.const]/10 ) 的允许结果,同样,因为它也不会触发任何限制(A 没有指针或引用成员,因此它们都没有引用没有静态存储持续时间的对象)。

最终,持续评估的问题归结为检查所有限制列表并查看是否有任何问题。我认为我们没有违反任何规则,所以这应该没问题。

关于c++ - consteval 函数返回具有非平凡 constexpr 析构函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58381924/

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