8

我在使用 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() 而没有别的。(如果没有 RVO)编译器不应该要求 A(const A &) 构造函数可以访问,对吗?

你能告诉我代码有什么问题吗?

使用最新版本的 g++,'g++ -std=c++0x' 和 'g++ -std=c++0x -fno-elide-constructors' 编译代码没有任何错误。

4

1 回答 1

5

这是优化器中的一个错误。编译器试图省略移动,但仅被编程为省略复制构造函数——这首先需要存在复制构造函数才能被省略。

我不记得此错误的修复方法是什么(如果有的话),但它可能已在 SP1 中修复。

于 2012-06-04T19:31:15.623 回答