在被 *** 注释的那一行中,为什么会调用 Bar 的复制构造函数?input_bar 是一个右值引用,因此我预计会调用移动构造函数。它转换为左值引用了吗?如果我将那一行改为 bar_(std::move(input_bar)),就可以调用移动构造函数了。
#include <iostream>
#include <array>
#include <memory>
class Bar
{
public:
Bar(const Bar& bar)
{
std::cout << "copy constructor called" << std::endl;
}
Bar(Bar&& bar)
{
std::cout << "move constructor called" << std::endl;
}
};
class Foo
{
public:
Foo(Bar&& input_bar) :
bar_(input_bar) // ***
{
}
Bar bar_;
};
int main()
{
Bar bar;
Foo foo(std::move(bar));
return 0;
}