Кажется, что копирование происходит даже при компиляции с -fno-elide-constructors

#include <iostream>

class A {
public:
    A() { std::cout << "Constructor" << std::endl; }
    A(const A& a) { std::cout << "Copy Constructor" << std::endl; }
    A& operator=(const A& a) { std::cout << "Copy = operator" << std::endl; }
    A(A&& a) { std::cout << "Move Constructor" << std::endl; }
    A& operator=(A&& a) { std::cout << "Move = operator" << std::endl; }
    ~A() { std::cout << "Destructor" << std::endl; }
};

void f(A&& a) { std::cout << "function" << std::endl; }

int main() {
    f(A());
    return 0;
}

Вывод следующей программы:

Constructor
function
Destructor

Почему здесь не вызывается конструктор перемещения? Кажется, что копирование происходит, даже если я компилирую с флагом -fno-elide-constructors: g++ test.cpp -fno-elide-constructors -std=c++11


person cuv    schedule 25.11.2016    source источник
comment
Я кажусь на редкость тупым? Конечно, A() вызывает конструктор по умолчанию, тогда анонимный временный объект может привязываться к f(A&&). Что мне не хватает? Конструктор перемещения можно вызвать только при наличии сконструированного объекта.   -  person Bathsheba    schedule 25.11.2016
comment
@Bathsheba: я не думаю, что ты что-то упускаешь. Учитывая A foo();, тогда A a{foo()}; вызовет конструктор перемещения, но в нынешнем виде двигаться не к чему.   -  person Martin Bonner supports Monica    schedule 25.11.2016
comment
@Bathsheba Что мне не хватает? Я не знаю... Немного хорошего личного времени? Может, тоже поспать? (не обращайте на меня внимания, просто клоунада. Дружеская шутка, без злого умысла).   -  person Adrian Colomitchi    schedule 25.11.2016
comment
Это не проблема, но не используйте std::endl, если вам не нужны дополнительные функции, которые он делает; '\n' заканчивает строку.   -  person Pete Becker    schedule 25.11.2016


Ответы (1)


Краткий ответ: Вы ничего не создаете с помощью перемещения.

Вы просто создаете временный объект A, а затем передаете на него ссылку. Если вы хотите увидеть конструкцию перемещения, вы можете, например. изменить подпись f на

void f(A a)
person MikeMB    schedule 25.11.2016