加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 完美转发,为什么析构函数会被调用两次?

发布时间:2020-12-16 10:11:44 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个模仿 Python语句的函数,但我遇到了一些我不太了解的有趣行为. 使用以下程序: #include iostreamstruct foo { foo() { std::cout "foo()" std::endl; } ~foo() { std::cout "~foo()" std::endl; }};auto make_foo() - foo { return {};}te
我正在尝试创建一个模仿 Python语句的函数,但我遇到了一些我不太了解的有趣行为.

使用以下程序:

#include <iostream>

struct foo {
  foo() { std::cout << "foo()" << std::endl; }
  ~foo() { std::cout << "~foo()" << std::endl; }
};

auto make_foo() -> foo {
  return {};
}

template <typename T,typename F>
auto with(T&& t,F&& fn) -> void {
  fn(std::forward<T>(t));
}

auto main() -> int {
  std::cout << "before" << std::endl;
  with(make_foo(),[](auto f) {
    std::cout << "during" << std::endl;
  });
  std::cout << "after" << std::endl;
}

当使用Xcode 6.3和-std = c 14提供的clang编译并运行时,我得到以下输出:

before
foo()
during
~foo()
~foo()
after

有人知道我为什么在输出中得到两个~foo()吗?

解决方法

以下是两个对象:

with(make_foo(),[](auto f) {

1^^^^^^^^^    2^^^^^^

make_foo()返回的对象和函数参数f.

如果您通过引用传递(更改为auto&& f),那么您将只看到一个对象的证据.

没有创建消息,因为这是由复制/移动构造创建的,并且您在这些构造函数中没有任何输出.

请注意,make_foo()中可能有更多对象,但您的编译器正在执行复制省略.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读