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

vit*_*aut 7 c++ reference temporary copy-constructor

请考虑以下代码:

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

int main() {
  const A &a = A();
}
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

因此,在将临时绑定到引用时,是否有必要使用复制构造函数?

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

有没有办法禁用临时绑定到const引用?

Alo*_*ave 4

那么,在将临时对象绑定到引用时,是否需要有一个可访问的复制构造函数?

C++11 后 - 否
C++11 前 - 是。


该代码可以在 GCC 4.7.2 上正常编译,因为它符合 C++11 标准。

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

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