gpt4 book ai didi

c++11 - 在这种情况下,c++ 正确的值何时会破坏?

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

代码如下:

class SomeType {
public:
SomeType() {}
~SomeType() {}

std::string xxx;
}
bool funtion_ab() {
SomeType(); // This is a right val;
// The right val destructs here when I test the code. I want to make sure that it would always destructs here.
int a = 0, b = 10;
....// other code
return true;
}

如果你知道真相,请告诉我。谢谢!

最佳答案

你所拥有的叫做 temporary object .从 §6.7.7 开始,

Temporary objects are created

  • when a prvalue is converted to an xvalue

或者,更具体地说,

[Note 3: Temporary objects are materialized:

...

  • when a prvalue that has type other than cv void appears as a discarded-value expression ([expr.context]).

— end note]

而且,在生命周期上,同一个部分有这样的话

Temporary objects are destroyed as the last step in evaluating the full-expression ([intro.execution]) that (lexically) contains the point where they were created.

您可以阅读有关表达式语义的更多信息,但在您的情况下,“完整表达式”相当明确。

SomeType();

包含构造函数调用的“完整表达式”是……构造函数调用本身。所以析构函数将在评估构造函数后立即被调用。此规则有一些异常(exception)情况(例如,如果临时对象作为异常抛出或作为引用绑定(bind)),但这些都不适用于此处。

如评论中所述,编译器可以自由地内联您的构造函数和析构函数调用,然后可以自由地注意到它们什么也不做,并完全忽略它们。优化器可以对您的代码做一些有趣的事情,前提是它不会改变语义。但是严格阅读标准表明析构函数正是在您建议的位置调用的。

关于c++11 - 在这种情况下,c++ 正确的值何时会破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74390256/

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