0

std ライブラリが代わりにこれらを使用しないのはなぜですか? 現在、コピー不可能なオブジェクトでコピー コンストラクターが呼び出された場合、エラー メッセージは少し「不可解」であるか、これまで遭遇したことがない人にとっては混乱を招く可能性があります。

初めてこのエラーメッセージが表示されたとき、クラスを調べて「コピー不可」を確認し、最終的に理解するまで、何が問題なのかわかりませんでした (アクセスできない ctors のアイデアは考えたこともありませんでした)。

copy-ctor を非公開にするメリットは何ですか? ctor オーバーロードの VS Intellisense では引き続き表示されます。

なぜ彼らは単に次のことを選択しなかったのですか:

public:
someClass(const someClass&) { static_assert(false, "someClass is of non-copyable type. calls to copy constructor are disallowed."); }

コードをコンパイルしようとすると、このエラー メッセージが表示され、エラーの理由がより明確に示されます。(const someClass&) と比較するとアクセスできません。テンプレートを多用すると、これを理解するのがどれほど難しいか想像してみてください。

では、プライベート copy-ctor と static_assert にはどのような利点があるのでしょうか?

4

2 に答える 2

2
  1. 不可解なメッセージの理由は、C++ ではなくコンパイラの問題ですが、C++ では適切なメッセージを実装するのが難しいのは事実です。たとえば、Clang は他のコンパイラよりも優れたエラー メッセージを提供します。

  2. なぜ MS が VS IntelliSense でプライベート オーバーロードを表示することにしたのかはわかりませんが、これは間違いなく С++ の問題ではなく、IDE の問題です (または、私が感じているいくつかの隠された未知のものがあります)。

  3. static_assert は C++11 でのみサポートされており、エラー メッセージを変更するためだけにさらに多くの標準仕様を変更する必要があります。

  4. プライベート コンストラクターは、C++ ではカスタム static_asserts よりも慣用的です。

  5. この提案も意味がありません。static_assert はコンパイラ エラーを引き起こします。いつも。誰かがコピー コンストラクターを呼び出そうとするかどうか。(コメントで@BenjaminLindleyが指摘したように)

于 2013-06-20T01:52:10.410 に答える
2

C++11 では、より良い方法があります。

someClass(const someClass&) = delete;

残念ながら、MSVC はまだサポートしていません。

しかし、希望があるかもしれません:

はい、VS 2013 プレビュー用に STL を準備するのに大忙しでした。Build カンファレンスの後に公開できる詳細な変更ログを含む VCBlog ドラフトを入手しました。

于 2013-06-20T01:53:34.950 に答える