gpt4 book ai didi

c++ - 会不会有一个临时的被销毁的返回值?

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

我对复制省略的新规则有点困惑,实际上我什至不确定它是否适用于这种情况。我有这个:

template <typename T> struct foo {
T t;
foo(const T& t) : t(t) {}
~foo() { std::cout << "destructor \n"; }
}

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

其中 make_foo 只是允许推导参数(在实际代码中 t 是一个 lambda,但为了简单起见,我在这里省略了它,或者更确切地说为了混淆起见,对此感到抱歉)如

auto x = make_foo(123);

现在我需要绝对确定 foo 的析构函数只被调用一次:当 x 超出范围时。恐怕这是一个不清楚你在问什么的问题,但如果很明显不会有任何临时 foo,那就足够回答了 ;)。

在 C++11 中,我可以确定 make_foo 中不会有临时的 foo 会被销毁吗?只有当 x 超出范围时才应调用析构函数。

正如评论中正确指出的那样,这个问题是 XY 问题的 Y 部分,而 X 部分是我想实现一些范围结束功能。 foo 的析构函数有一些副作用(在示例中是 cout),应该在 x 范围的末尾调用而不是在make_foo 以防有一些临时的 foo

最佳答案

在 C++11 中,即使是无名临时复制省略也只是允许而不是强制的。这里描述了copy elision .自 C++17 起强制执行。

同样在 C++17 中,您将拥有自动推导指南,因此您将不需要这样的构造。

并且您可以测试您的编译器,因为大多数现代编译器都会在此处省略复制。

关于c++ - 会不会有一个临时的被销毁的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49379483/

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