【发布时间】:2012-06-04 07:49:24
【问题描述】:
我在使用 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' 编译代码没有任何错误。
【问题讨论】:
-
尝试将
A()更改为{}- 它可能与此有关:stackoverflow.com/questions/7935639/… -
@Pubby 很好的链接,但我认为这是一个不同的问题。离开 `A makeA();'仅在代码中并将 makeA() 的主体移动到另一个文件应该使上述更改不可见。如果没有第 22 行,代码将编译。我认为这不是 makeA() 函数的问题。
-
99% 确定这是一个编译器错误。请在MS Connect 上发布错误报告并在此处发布指向它的链接。
-
此错误已在 VS2012 RC 中修复。是时候进入 VS2012 了。
标签: c++ visual-studio-2010 visual-c++ c++11 rvalue-reference