gpt4 book ai didi

c++ - 对于调用结果的复制初始化顺序,它是否被认为是 GCC 和 Clang 的错误?

转载 作者:行者123 更新时间:2023-12-04 02:25:19 25 4
gpt4 key购买 nike

请看这个example

#include <iostream>
struct A{
A(){
std::cout<<"A constructed\n";
}
~A(){
std::cout<<"A destroyed\n";
}
};
struct B{
B(int){
std::cout<<"B constructed\n";
}
~B(){
std::cout<<"B destroyed\n";
}
};
struct C{
C(){
std::cout<<"C constructed\n";
}
~C(){
std::cout<<"C destroyed\n";
}
bool operator==(B const&){
return true;
}
};
struct D{
D(bool){
std::cout<<"D constructed\n";
}
};
bool fun(){
A a;
C c;
return c==0;
}
int main(){
D d = fun();
}

以上示例的输出在 GCC 和 Clang 中都是相同的,它们是

A constructed
C constructed
B constructed
B destroyed
C destroyed
A destroyed
D constructed

这意味着调用结果的复制初始化在该函数的局部或临时变量的所有销毁之后排序。它与以下规则相矛盾,即
[stmt.return#3]

The copy-initialization of the result of the call is sequenced before the destruction of temporaries at the end of the full-expression established by the operand of the return statement, which, in turn, is sequenced before the destruction of local variables ([stmt.jump]) of the block enclosing the return statement.

按照规则,输出应该是这样的

A constructed
C constructed
B constructed
D constructed
B destroyed
C destroyed
A destroyed

是不是GCC和Clang的bug?

最佳答案

相关函数的返回值是一个bool。这就是返回的内容。

您记录的输出没有显示任何证据表明 bool 返回值的复制初始化何时排序,在其他任何事情之前或之后。

这也恰好是一旦 bool 值被返回,调用者使用它来构造一个新的 D 实例。但这与函数调用返回的 bool 值的复制初始化语义完全无关。

关于c++ - 对于调用结果的复制初始化顺序,它是否被认为是 GCC 和 Clang 的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68152047/

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