#include <iostream>
#include <typeinfo>
struct C {
explicit C() {std::cout << "constructor" << std::endl; }
C (const C&) { std::cout << "copyconstructor" << std::endl;}
~C() { std::cout << "destructor" << std::endl; }
};
int main(){
C c1;
auto f = [c1](){c1;};
std::cout << "leaving function scope" << std::endl;
return 0;
}
Составитель сПочему CopyConstructor вызывается с помощью Lambdas/Closures?
g++ -o a -std=c++11 test.cpp -fno-elide-constructors
формирует выходной сигнал:
constructor copyconstructor copyconstructor destructor leaving function scope destructor destructor
Compiling с
g++ -o a -std=c++11 test.cpp
генерируют выходной сигнал:
constructor copyconstructor leaving function scope destructor destructor
Так как я пропустил параметр компилятора -fno-elide-constructors
во второй компиляции, почему сгенерированный код все еще вызывает CopyConstructor один раз? Я предположил, что g++
компилятора автоматически использовать копию Пропуск для инициализации auto f
, как он сделал для инициализации закрытия, которая будет иметь результат:
constructor construtor leaving function scope destructor destructor
'-fno-elide-constructors' не является оптимизацией. Это наоборот. – juanchopanza
Вы просите компилятор сделать копию 'c1', когда вы запишете ее в лямбда, что вы ожидаете от нее в этом случае? – Praetorian
'f' является копией' c1', поэтому должна быть задействована хотя бы одна копия. – juanchopanza