Конструктор C++ со ссылкой на rvalue

Рассмотрим этот класс с тремя конструкторами:

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 создан правильно, но я не понимаю, почему компилятор не использует явно указанный один. Я что-то упустил здесь?

5
задан Nicol Bolas 29 April 2012 в 17:52
поделиться