Я створюю клас ланцюгового типу, наприклад маленький приклад нижче. Здається, що при ланцюжку функцій-членів викликається конструктор копій. Чи є спосіб позбутися виклику конструктора копій? У моєму прикладі іграшок нижче, очевидно, що я маю справу лише з тимчасовими, і тому "повинен" (можливо, не за стандартами, але логічно) бути елісією. Другим кращим вибором - скопіювати elision - було б викликати конструктор ходу, але це не так.
class test_class {
private:
int i = 5;
public:
test_class(int i) : i(i) {}
test_class(const test_class& t) {
i = t.i;
std::cout << "Copy constructor"<< std::endl;
}
test_class(test_class&& t) {
i = t.i;
std::cout << "Move constructor"<< std::endl;
}
auto& increment(){
i++;
return *this;
}
};
int main()
{
//test_class a{7};
//does not call copy constructor
auto b = test_class{7};
//calls copy constructor
auto b2 = test_class{7}.increment();
return 0;
}
Редагувати: Деякі пояснення. 1. Це не залежить від рівня оптимізації. 2. У моєму реальному коді у мене складніші (наприклад, виділені купи) об'єкти, ніж ints
auto b = test_class{7};
не викликає конструктор копій, оскільки він дійсно еквівалентний, test_class b{7};
і компілятори досить розумні, щоб розпізнати цей випадок, і тому можуть легко ухилитись від будь-якого копіювання. Те ж саме неможливо зробити b2
.
std::cout
) у вашому копіювальному пристрої? Без цього копію слід оптимізувати.