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
を取得し、次にそれを指示します。そのオブジェクトで宛先オブジェクトを初期化します。GCC はこのコードを好みませんが、Clang と Comeau/EDG は上記のセマンティクスに従って受け入れます。Hugo
Hugo const&
Hugo
Hugo