14

このコードは私を混乱させます:

struct foo {
  int i;

  foo(int j) : i(j) {}

  foo(const foo &) = delete;
  foo(foo &&) = delete;
  foo &operator=(const foo&) = delete;
  foo &operator=(foo&&) = delete;
};

bool operator<(const foo &f1, const foo &f2)
{
  return f1.i < f2.i;
}

int main(int argc, char **argv)
{
  std::map<foo,int> f;
  std::map<foo,int> f2 = f; //error (as expected)
  std::map<foo,int> f3 = std::move(f); //no error (why?)
  return 0;
}

そこでエラーが発生しないため、マップを移動するときにキー オブジェクトが作成されないように見えます (別のキー オブジェクトをマップに移動しても)。

なぜだめですか?C++11 標準に従って、この動作に依存できますか?

より一般的には、どのようなコピー/移動要件がキーと値の型std::mapに配置され、どのような条件下で行われますか?

4

2 に答える 2