Этот код испускает error C2248: 'A::A' : cannot access private member declared in class 'A'
в VS2010, хотя RVO не нуждается в конструкторе копирования. Чтобы доказать это, просто сделайте публичное заявление A(const A&);
ниже, и код будет выполняться без проблем, даже без определения для конструктора копирования.
class A
{
int i;
A(const A&);
public:
A() : i(1) {}
};
A f() { return A(); }
int main()
{
A a;
a = f();
}
Тот факт, что ваша программа не вызывает фактического вызова конструктора копирования, не означает, что его можно пропустить. Объявление, но не определение его просто «обманывает» компилятор, делая функцию доступной во время компиляции, но не во время компоновки, поэтому, как только вызов к нему оптимизирован, все «работает». Но RVO — это оптимизация производительности, и ваша программа должна быть написана так, чтобы она была правильной без присутствия RVO.
Других решений пока нет …