临时绑定到引用需要在C ++中的复制构造函数吗?

临时绑定到引用需要在C ++中的复制构造函数吗?

问题描述:

请考虑以下代码:

class A {
  A(const A&);
 public:
  A() {}
};

int main() {
  const A &a = A();
}

此代码使用GCC 4.7.2进行编译,但无法使用Visual C ++ 2010出现以下错误:

This code compiles fine with GCC 4.7.2, but fails to compile with Visual C++ 2010 with the following error:

test.cc(8) : error C2248: 'A::A' : cannot access private member declared in class 'A'
        test.cc(2) : see declaration of 'A::A'
        test.cc(1) : see declaration of 'A'

因此,在将临时数据绑定到引用时,是否需要有一个拷贝构造函数?

So is it necessary to have a copy constructor accessible when binding a temporary to a reference?

这与我之前的问题有些相关:

This is somewhat related to my previous question:

Is there a way to disable binding a temporary to a const reference?


因此,在将临时数据绑定到引用时,是否需要有一个复制构造函数?

C ++ 11 - 无

Pre C ++ 11 - 是的。

Post C++11 - No
Pre C++11 - Yes.

此代码使用GCC 4.7.2进行编译,因为它符合C ++ 11标准。

This code compiles fine with GCC 4.7.2 because it is compliant with the C++11 standard.

C ++ 11标准强制要求从 prvalue 初始化const引用时,必须直接绑定到不允许创建引用对象和临时对象。此外,不使用或不需要复制构造函数。

C++11 standard mandates that when a const reference is initialized from prvalue, it must be bound directly to the reference object and no temporary is permitted to be created. Also, the copy constructor is not used or required.

在C ++ 11之前,规则是不同的。而这个行为(是否会调用复制构造函数)是实现定义的。 C ++ 03允许在将const引用绑定到临时的时候调用复制构造函数,因此复制构造函数需要可访问。 Visual C ++ 2010遵循C ++ 03标准。

Prior to C++11 the rules were different. And this behavior(whether copy constructor will be called) is implementation defined. C++03 allowed the copy constructor being called while binding a const reference to an temporary and hence post C++11 the copy constructor needs to be accessible. Visual C++2010 adheres to the C++03 standard.