3 つのコンストラクターを持つこのクラスを検討してください。
class Circle {
public:
Circle(int r) {
_radius = r;
}
Circle(const Circle& c){
_radius = c.radius();
cout << endl << "Copy constructor with lvalue reference. Radius: " << _radius;
}
Circle(Circle&& c){
_radius = c.radius();
cout << endl << "Copy constructor with rvalue reference. Radius:" << _radius;
}
int radius() const {
return _radius;
}
private:
int _radius;
};
int main() {
Circle c1(2);
Circle c2(c1);
cout << endl << c2.radius();
Circle c3(Circle(4));
cout << endl << c3.radius();
return 0;
}
「g++ -std=c++0x」でコンパイル。出力は次のとおりです。
Copy constructor with lvalue reference. Radius: 2
2
4
わかった。最初の 2 つのケースの適切なコンストラクターが呼び出されます。しかし、3 番目のケース、つまり Circle c3(Circle(4)) の場合、3 番目のコンストラクター (右辺値参照付きのコピー コンストラクター) が呼び出されることを期待しますが、そうではありません。c3が適切にインスタンス化されているため、明らかにいくつかのコンストラクターが呼び出されますが、コンパイラーが明示的に提供されたコンストラクターを使用しない理由がわかりません。ここで何か不足していますか?