Я создаю класс типа цепочки, такой как маленький пример ниже. Похоже, что при объединении функций-членов вызывается конструктор копирования. Есть ли способ избавиться от вызова конструктора копирования? В моем примере с игрушкой, приведенным ниже, очевидно, что я имею дело только с временными, и поэтому «должно» (возможно, не по стандартам, но логически) быть правомочным. Второй лучший вариант - скопировать 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. В моем реальном коде у меня есть более сложные (например, выделенные в куче) объекты, чем целые
auto b = test_class{7};
не вызывает конструктор копирования, потому что он действительно эквивалентен, test_class b{7};
а компиляторы достаточно умны, чтобы распознать этот случай и поэтому могут легко исключить любое копирование. То же самое не может быть сделано для b2
.
std::cout
) в вашем экземпляре ctor? Без этого копия должна быть оптимизирована.