Почему для ссылки r-значения на вызов генератора объектов требуется конструктор копирования?

У меня возникают проблемы со следующим кодом в Visual Studio 2010 C++.

makeA() — это просто идиома генератора объектов в C++ (например, std::make_pair)

#include <stdio.h>

struct A{ // 7th line
    A() {}
    A(A &&) {printf("move\n");}
    ~A() {printf("~A();\n");}
private:
    A(const A &) {printf("copy\n");} // 12th line
};

A makeA()
{
    return A();
}

int main()
{
    A &&rrefA(makeA()); // 22nd line
    return 0;
}

Сообщение об ошибке

2>d:\test.cpp(22): error C2248: 'A::A' : cannot access private member declared in class 'A'
2>          d:\test.cpp(12) : see declaration of 'A::A'
2>          d:\test.cpp(7) : see declaration of 'A'
2>

Я ожидаю, что makeA() вызовет как конструктор A(), так и конструктор A(A &&), и 22-я строка для вызова makeA() и больше ничего. (Если без РВО) Компилятор не должен требовать, чтобы конструктор A(const A &) был доступен, я прав?

Не подскажете, что не так с кодом?

В последних версиях g++ 'g++ -std=c++0x' и 'g++ -std=c++0x -fno-elide-constructors' компилируют код без ошибок.

8
задан ildjarn 4 June 2012 в 19:29
поделиться