事實上,複製構造函數應該,imho,總是以const引用作爲參數。
X(X& rhs) { } // does not modify rhs
這不允許複製常量對象,因此下面的代碼不會編譯。 雖然非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
是常量,但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; }
。 你當然可以提供兩個安全的方面。
我可以看到我的問題已被輕微誤解。我不問如何重寫複製構造函數,我的問題是在給定使用類X的大量代碼時是否存在任何危險。此代碼是由完全不知道const並且正在使用編譯器不關心。現在在移植到一個新的編譯器時,我剩下的代碼不能編譯,並且我不能在STL中使用類。 – john 2013-04-22 17:15:55