В строке, прокомментированной ***, почему вызван конструктор копии Bar? input_bar
- это ссылка на rvalue, поэтому я ожидаю, что будет вызываться конструктор перемещения. Он преобразовал в ссылку lvalue? Я могу сделать вызов конструктора перемещения, если я изменю эту строку на 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;
}
См. Http://stackoverflow.com/q/27554296/981959 –