5

Nicolai M. Josuttis の「The C++ Standard Library (Second Edition)」を読んでいて、std::pair. 著者は次のように述べています。

C++11 以降pair<>、非定数のコピー コンストラクターのみを持つ型を使用すると、コンパイルされなくなりました。

次に、彼は次の例を挙げます。

class A 
{
   public:
     ...
     A( A& ); // copy constructor with nonconstant reference
     ...
};

std::pair<A, int> p; // Error since C++11

しかし、標準委員会が標準ライブラリ標準にこの修正を加えることにした理由に興味がありますか? その理由をググってみましたが、関連するものを見つけることができませんでした。

4

1 に答える 1

4

C++98 では、非定数参照パラメーターを持つコピー コンストラクターは、要素を "移動" するために (ab) 使用されます。このようなコードは、安全でなく、不明瞭であることで知られていました。悪名高く、現在は推奨さstd::auto_ptrれていないものは、その代表的な例です。

C++11 では、ムーブ セマンティクスと右辺値参照を使用して、同じ効果をより安全かつ明確に実現しています。これは、右辺値参照が変更可能なオブジェクトへの参照であるためです。ただし、一時オブジェクトや明示的に ( を介してstd::move) キャストし、使い捨てとしてマークしたものなどの「安全な」式にのみバインドできます。

要するに、非参照メンバーを取るコピー コンストラクターを持つクラスには、右辺値参照でより適切かつ安全に実行できない実際の使用例はありません。そのようなセマンティクスに対応std::pairする移動コンストラクターを取得しました。std::pair(std::pair&&)=default

于 2013-05-17T20:04:17.957 に答える