如果我编译(在G ++下)并运行以下代码,则打印"Foo :: Foo(int)".但是,在使复制构造函数和赋值运算符成为私有之后,它无法使用以下错误进行编译:"错误:'Foo :: Foo(const Foo&)'是私有的".如果只在运行时调用标准构造函数,它如何需要复制构造函数?
#include <iostream>
using namespace std;
struct Foo {
Foo(int x) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo& operator=(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
};
int main() {
Foo f = Foo(3);
}
Run Code Online (Sandbox Code Playgroud)
小智 15
这里使用了复制构造函数:
Foo f = Foo(3);
Run Code Online (Sandbox Code Playgroud)
这相当于:
Foo f( Foo(3) );
Run Code Online (Sandbox Code Playgroud)
其中第一组parens是对复制构造函数的调用.你可以说:
Foo f(3);
Run Code Online (Sandbox Code Playgroud)
请注意,编译器可能会选择优化复制构造函数调用,但复制构造函数仍必须可用(即不是私有的).无论复制构造函数的实现是什么,C++标准都特别允许这种优化(参见第12.8/15节).