実際、コピーコンストラクターは、常に引数として const 参照を取る必要があります。
X(X& rhs) { } // does not modify rhs
これは const オブジェクトのコピーを許可しないため、次のコードはコンパイルされません。非 const オブジェクトは const 引数として機能できますが、その逆は不可能です
X const test;
X new_x(test);
誰かが const オブジェクトのコピーを排除する必要がある理由を想像できません。
行いたい変更について: コピー コンストラクターは、非 const で定義された X メンバー関数に依存していますか?
これは魅力のように機能しますが、const オブジェクトのコピーを許可します。
class X
{
private:
int a;
public:
X(X &rhs) { a = rhs.value(); }
int& value (void) { return a; }
};
rhs
次の例は、 const であるが const ではないため、コンパイルされませvalue()
ん。
class X
{
private:
int a;
public:
X(X const &rhs) { a = rhs.value(); }
int& value (void) { return a; }
};
クラス const を正しくしたい場合は、おそらくクラス全体を調べる必要があります。クラス内の実装にのみ影響するはずです。外部コードがクラスメンバー関数の「非定数性」に依存する必要があるケースがわからないためです。私の例のように、パブリックメンバー関数によって非定数参照が返される場合を除きます。
次のスニペットは意図したとおりに機能します。
class X
{
private:
int a;
public:
X(int const &b) : a(b) { }
X(X const &rhs) { a = rhs.value(); }
int const & value (void) const { return a; }
};
ただし、これは次のようなコードに干渉することに注意してください。
X test(100);
test.value() = 12;
これは を使用しても機能しますint& value (void) { return a; }
が、 では失敗しint const & value (void) const { return a; }
ます。もちろん、安全のために両方を提供することもできます。