【问题标题】:Why does r-value reference to object generator call require copy constructor?为什么对对象生成器调用的 r 值引用需要复制构造函数?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 在 VC++ 2010 SP1 中未修复。也许在 VC11 中?
  • 我已经安装了 VS 2012 RC 并检查了代码是否正常工作。它已在 VS2012 中修复。谢谢。
  • 哦,如果没有定义复制构造函数,我认为它可以工作,但仍然可以公开访问。
  • 也许可以公开访问的默认复制构造函数被认为正在调用。
猜你喜欢
  • 2013-11-23
  • 2019-11-16
  • 2012-03-16
  • 2010-12-22
  • 1970-01-01
  • 2017-06-13
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多