Вопрос по constructor, c++11, rvalue-reference, c++ – Конструктор C ++ со ссылкой на rvalue

3

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

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

ХОРОШО. Правильные конструкторы для первых двух случаев называются. Но для третий случай, то есть круг с3 (круг (4)), я ожидаю третьего конструктора, (конструктор копии с rvalue referecne), который должен быть вызван, но это не так. Очевидно, что вызывается какой-то конструктор, так как c3 создан правильно, но я Я не понимаю, почему компилятор не использует явно предоставленные один. Я что-то здесь упускаю?

Ваш Ответ

2   ответа
5

она должна быть неконстантной, поскольку содержимое аргумента конструктора будет перемещено, и обычно это операция, которая изменяет состояние операнда (хотя и не в вашем конкретном случае):

Circle(Circle&& c){ }

Кроме того, вы видите копию разрешения здесь:

Circle c3(Circle(4));

поэтому конструктор перемещения не вызывается. Это стандартная оптимизация компилятора, которая может или не может произойти. Если бы вы должны были построитьCircle как это:

Circle c3(std::move(c1));

тогда вы вызываете конструктор перемещения.

Error: User Rate Limit Exceeded PoP
Error: User Rate Limit Exceeded
7

потому что ваш компилятор слишком умен для вашего кода;)

 Circle c1(2);

Это просто создает объект сint конструктор преобразования.

 Circle c2(c1);

Это операция копирования.c1 является l-значением, поэтому оно вызывает копию.

 Circle c3(Circle(4));

Здесь ваш компилятор распознает, что вы в основном говорите ему создать объект дважды. Так чтоelides один из конструкторов объекта. Это разрешено в данном случае спецификацией C ++.

Если ваш компилятор не может исключить конструкцию, он выполнит перемещение. Кроме того, если ваш компилятор не можетthat, выброси это.

Так что никакого движения не происходит.

Error: User Rate Limit ExceededacceptingError: User Rate Limit Exceeded

Похожие вопросы