デフォルトでコピー構築をオフにするコンパイラスイッチはありますか?
いいえ、私は本当にないことを願っています。幸いなことに、私の知る限りでは、それは確かに事実です。
組み込み型とポインター以外でコピー構築を許可する必要がある理由はありますか?
確かに。たとえば、型に値のセマンティクスを与え、クラスのさまざまなインスタンスを同じ概念エンティティとして扱う場合です。そしてその場合、コピーを作成することは非常に便利なことであることがわかります。
一方、コピー不可能なクラスが必要な場合(これにはユースケースがあります)、コピーコンストラクターをprivate
(ご自身で提案したように)宣言するか、C++11では削除済みとしてマークすることができます。 :
struct X
{
X(X const&) = delete;
};
あなたが書くものに関して:
何度も、void MyFunc(MyClass val)
代わりに書いたので、void MyFunc(const MyClass& val)
バグのデバッグに何時間も費やさなければなりませんでした
間違いを犯す可能性があることは理解していますが、そこから学ぶ必要があります。次のような通常の関数を作成することもできfoo()
ます。
void foo(int x) { x++; }
3
そして、引数として値がである変数を渡すと、呼び出しが戻った後のその変数の値がではない理由を理解しようと何時間も誓います4
。ああ、あなたは参照記号を追加するのを忘れました:
void foo(int& x) { x++; }
// ^
これが、参照渡しをデフォルトにするコンパイラオプションが必要な理由ですか?あまり。これは、言語ルールを変更するためのオプションになります。
あなたのコンパイラが本当にあなたが望むようなスイッチを持っていて、ある日あなたがそのスイッチを使っていない他の誰かにあなたのプログラムを送るなら、想像してみてください:彼らは問題がどこにあるかを見つけるためにそれをデバッグするのに何時間かかりますか? ?
私のアドバイスは、経験から学び、読み書きのスキルを標準語に適応させることです。その逆ではありません。