构造函数访问规则

kyk*_*yku 3 c++ constructor

如果我编译(在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节).