实际上,我认为复制构造函数应该始终以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,但
value()
不是const。
class X
{
private:
int a;
public:
X(X const &rhs) { a = rhs.value(); }
int& value (void) { return a; }
};
如果您想使您的类具有const正确性,您可能需要检查整个类。它应该只影响您的类内实现。因为我不知道外部代码应该依赖于类成员函数的“非constness”的情况,除非在我的示例中由任何公共成员函数返回非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; }
将失败。
当然,为了安全起见,您可以同时提供两个。