gpt4 book ai didi

c++ - 这是一种击败省略以保持 dtor 副作用的方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:40 24 4
gpt4 key购买 nike

我想确保析构函数的副作用保留在作为 RVO 候选者的函数中。我的目标是在进入和退出时对堆栈进行快照,并显示预期的堆栈变量。这段代码似乎适用于 C++11 而无需使用特定于编译器的选项,但我不知道如何在不添加虚假的 Test 实例以创建多个返回路径的情况下在早期版本中执行此操作。是否有一些技术,它是否总是适用于 c++11?

class Test {
public:
int m_i;
Test() { m_i = 0; cout << "def_ctor" << endl; }
Test(const Test& arg) { this->m_i = arg.m_i; cout << "copy_ctor" << endl;}
~Test() { cout << "dtor needed for side effects" << endl; }
};

Test foo() {
Test ret;
return std::move(ret);
}

int main()
{
Test x=foo();
}

最佳答案

std::move 不是魔法,它只是一个返回对其参数的引用的函数,因此您应该能够在任何版本的 C++ 中执行相同的操作

template<typename T>
const T&
defeat_rvo(const T& t)
{ return t; }

Test foo() {
Test ret;
return defeat_rvo(ret);
}

我认为你也可以通过返回一个引用来更直接地做到这一点:

Test foo() {
Test ret;
const Test& ref = ret;
return ref;
}

copy elision规则是说当return语句中的表达式是“一个非volatile自动对象的名称”时,可以直接在返回值中构造局部对象,这里不是这样的,因为它是一个对对象的引用,而不是对象本身的名称。我不太确定这种情况,但类型转换应该有效:

Test foo() {
Test ret;
return static_cast<const Test&>(ret);
}

这绝对不是对象的名称,也不是对象的别名,它是一个强制转换表达式。

关于c++ - 这是一种击败省略以保持 dtor 副作用的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36781243/

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