我将尝试创建一个函数,模仿Python的with语句,但我遇到了一些有趣的行为,不太理解。
有人知道为什么我的输出中会得到两个
以下是程序内容:
#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提供的clang编译器并添加-std=c++14
标志进行编译后运行,输出结果如下:
before
foo()
during
~foo()
~foo()
after
有人知道为什么我的输出中会得到两个
~foo()
吗?
auto main() -> int
而不是int main()
? - Victor Polevoywith
等价物。 - juanchopanzaauto
是按值传递的,它是从右值构造出来的。 - Piotr Skotnickifoo(), foo(foo&&), during, ~foo(), ~foo()
,如果您把这个作为答案发布,我很乐意接受它。 - Sam Kellett