код:
#include <iostream>
class A {
public:
A() {
}
A(const A& a) {
std::cout << "Copy constructor" << std::endl;
}
A(A&& a) {
std::cout << "Move constructor" << std::endl;
}
};
int main()
{
{//case 1
A b = A(A());
}
std::cout << std::endl;
{// case 2
A a;
A b = A(a);
}
std::cout << std::endl;
{//case 3
A a;
A b = A(std::move(a));
}
}
Вывод (с флагом компиляции -O3):
#case 1
#nothing printed
#case 2
Copy constructor
#case 3
Move constructor
В случае 2, почему конструктор копирования вызывается даже с максимальным уровнем оптимизации (-O3)?
Я ожидал, что компилятор обнаружит, что переменная 'a' похожа на временную (потому что используется только для построения 'b') и скорее использует конструктор перемещения (как в случае 3).
Насколько мне известно, есть по крайней мере один случай (оптимизация возвращаемого значения), когда компилятор может изменить наблюдаемое поведение программы, избегая вызова конструктора копирования, который имеет побочный эффект.
Поэтому мне было интересно, возможно ли в случае 2, также в целях оптимизации, заменить вызов конструктора копирования конструктором перемещения, зная, что переменная a никогда не используется вне конструкции b.