は、次のコードを見てください:のstd ::コピー不能オブジェクトを使用してマップ<> ::挿入し、均一な初期化
#include <utility>
#include <map>
// non-copyable but movable
struct non_copyable {
non_copyable() = default;
non_copyable(non_copyable&&) = default;
non_copyable& operator=(non_copyable&&) = default;
// you shall not copy
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
int main() {
std::map<int, non_copyable> map;
//map.insert({ 1, non_copyable() }); < FAILS
map.insert(std::make_pair(1, non_copyable()));
//^same and works
}
がg ++ 4.7の標線をコメントアウトするとき、このスニペットが失敗したコンパイル。生成されたエラーは、non_copyable
がコピーできないことを示しますが、私はそれが移動されることを期待しました。
なぜ均一な初期設定を使用して構築std::pair
を挿入しない失敗ではなくstd::make_pair
を使用して構築さ1?両方ともうまくマップに移動することができる値を生成するとは思われませんか?
はい、それは私が私の答えを削除する前に書いたものは基本的です。私は疑問があります:なぜ、 'initializer_list <>'はここで作られていますか? 'std :: pair'はコンストラクタを持っていないようです。私は均一な初期化構文が 'pair <>'の通常のコンストラクタを選ぶと思っていました。 –
また、initializer_list <>要素はすべて同じ型でなければなりません。両方のコメントに – eladidan
+1。私の例では、「initializer_list」はありません。これは、一様初期化を使用する 'std :: pair'コンストラクタの呼び出しのようなものです。 – mfontanini