Search code examples
c++c++11move

Creating a pair from temporaries


I try to construct a pair from temporaries. From what I understand, std::pair provides the necessary constructors, but I cannot make it work. This is my minimal example:

#include <utility>

struct Test {
  Test() : a(1.0) {}

private:
  double a;
  Test(Test&&) = default;
  Test(const Test&) = delete;
  Test& operator=(Test&&) = delete;
};

int main (int argc, char** argv) {
  std::pair<Test, double> result(Test(), 0.0);
}

I tried to compile this with clang++-3.8 --std=c++14. The copy constructor for Test is invoked by pair. Because it was deleted, I get the error call to deleted constructor of 'Test'. It does not seem to be a problem with the compiler though, because I get a similar error with gcc, see https://ideone.com/n5GOeR.

Can someone explain to me why the above code fails to compile?


Solution

  • My gcc (6.1.1) gives a slightly different error message, which is more helpful:

    t.C:8:3: note: declared private here
       Test(Test&&) = default;
       ^~~~
    

    Your move constructor is private. It obviously must be public.