아래의 작은 예제와 같은 체인 유형의 클래스를 만들고 있습니다. 멤버 함수를 연결할 때 복사 생성자가 호출되는 것 같습니다. 복사 생성자 호출을 제거하는 방법이 있습니까? 아래의 장난감 예제에서, 나는 단지 임시적인 것만을 다루고 있으므로 "표준에 의해서가 아니라 논리적으로"소멸해야한다는 것이 명백하다. 제거를 복사하는 두 번째 최선의 선택은 이동 생성자를 호출하는 것이지만, 그렇지 않습니다.
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
사본 관리자에 실제로 I / O ( )가 있습니까? 그것 없이는 복사본을 최적화해야합니다.