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()吗? 解决方法
以下是两个对象:
1^^^^^^^^^ 2^^^^^^ make_foo()返回的对象和函数参数f. 如果您通过引用传递(更改为auto&& f),那么您将只看到一个对象的证据. 没有创建消息,因为这是由复制/移动构造创建的,并且您在这些构造函数中没有任何输出. 请注意,make_foo()中可能有更多对象,但您的编译器正在执行复制省略. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |