以下の小さな例のように、連鎖タイプのクラスを作成しています。メンバー関数をチェーンすると、コピーコンストラクターが呼び出されるようです。コピーコンストラクタの呼び出しを取り除く方法はありますか?以下の私のおもちゃの例では、私が一時的なものだけを扱っていることは明らかであり、したがって、(標準ではないかもしれませんが、論理的には)省略があるはずです。省略をコピーするための2番目の最適な選択は、移動コンストラクターを呼び出すことですが、これは当てはまりません。
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.実際のコードでは、intよりも複雑な(たとえば、ヒープが割り当てられた)オブジェクトがあります。
auto b = test_class{7};
test_class b{7};
と同等であり、コンパイラーはこのケースを認識できるほどスマートであり、コピーを簡単に排除できるため、コピーコンストラクターを呼び出しません。同じことはできませんb2
。
std::cout
コピートラクターに実際にI / O()がありますか?それがなければ、コピーは最適化されるべきです。