我的理解是,在调用移动构造函数后,析构函数会在输入上被调用。我决定在代码中测试这一点(见底部),但结果与我预期的不同。使用std::unique_ptr
也得到了相同的结果。
预期:
1
2
bar constructed
foo destructed //due to move
3
i'm foo
4
[Error?]
实际:
1
2
bar constructed
3
i'm foo
4
i'm foo
5
foo destructed
foo destructed
代码:
#include <iostream>
class Foo
{
public:
~Foo()
{
std::cout << "foo deconstructed" << std::endl;
}
void speak()
{
std::cout << "i'm foo" << std::endl;
}
};
class Bar
{
public:
Bar(Foo&& foo) : foo_(std::move(foo))
{
std::cout << "bar constructed" << std::endl;
}
Foo foo_;
};
int main()
{
std::cout << "1" << std::endl;
Foo foo;
std::cout << "2" << std::endl;
Bar bar(std::move(foo));
std::cout << "3" << std::endl;
bar.foo_.speak();
std::cout << "4" << std::endl;
foo.speak();
std::cout << "5" << std::endl;
return 0;
}
Bar bar(Foo())
不会创建一个Bar
对象。 - Lightness Races in OrbitBar bar((Foo()))
也可以用来避免最令人烦恼的解析。 - Nicu Stiurca