HugoCopy
您可以通过使用如下的显式类来解决此问题
class HugoCopy;
class Hugo {
public:
Hugo() { ... }
Hugo(HugoCopy const&);
explicit Hugo(Hugo const&) { ... }
};
struct HugoCopy {
HugoCopy(Hugo const& hugo)
:hugo(hugo)
{ }
Hugo const& hugo;
};
Hugo::Hugo(HugoCopy const&) { ... }
现在适用以下语义
Hugo a;
Hugo b = a; // forbidden
Hugo c(a); // allowed
Hugo d = HugoCopy(a); // allowed
Hugo f() {
Hugo a;
return a; // forbidden
return HugoCopy(a); // allowed
}
或者,您可以使用转换功能
class Hugo {
public:
Hugo() { ... }
explicit Hugo(Hugo const&) { ... }
};
struct HugoCopy {
HugoCopy(Hugo const& hugo)
:hugo(hugo)
{ }
operator Hugo const&() { return hugo; }
private:
Hugo const& hugo;
};
这依赖于 C++ 语言的一个微妙角落。所以如果你使用它,你最好知道你在做什么或者你不这样做:它首先调用 HugoCopy 上的转换函数(或者在第一种情况下, 的构造函数Hugo
)来获取Hugo
/ Hugo const&
,然后它直接Hugo
用该对象初始化目标Hugo
对象。GCC 不喜欢该代码,但 Clang 和 Comeau/EDG 根据上述语义接受它。