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)
因此,在将临时绑定到引用时,是否有必要使用复制构造函数?
这与我之前的问题有些相关:
那么,在将临时对象绑定到引用时,是否需要有一个可访问的复制构造函数?
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 标准。