Рассмотрим этот класс с тремя конструкторами:
class Circle {
public:
Circle(int r) {
_radius = r;
}
Circle(const Circle& c){
_radius = c.radius();
cout << endl << "Copy constructor with lvalue reference. Radius: " << _radius;
}
Circle(Circle&& c){
_radius = c.radius();
cout << endl << "Copy constructor with rvalue reference. Radius:" << _radius;
}
int radius() const {
return _radius;
}
private:
int _radius;
};
int main() {
Circle c1(2);
Circle c2(c1);
cout << endl << c2.radius();
Circle c3(Circle(4));
cout << endl << c3.radius();
return 0;
}
Скомпилирован с "g++ -std=c++0x". Вывод:
Copy constructor with lvalue reference. Radius: 2
2
4
ОК. Правильные конструкторы для называются первые два случая. третий случай, т. е. Circle c3 (Circle (4 )), я ожидаю, что третий конструктор, (конструктор копирования со значением referecne ), который нужно вызвать, но это не так. Очевидно, что вызывается какой-то конструктор, поскольку экземпляр c3 создан правильно, но я не понимаю, почему компилятор не использует явно указанный один. Я что-то упустил здесь?