2

这个问题仅指 pre C++11。考虑以下看似损坏的代码:

struct X
{
    X(){} // default user-provided constructor
private:
    X(const X&){}
};

int main()
{
    X x = X();
}

Live on Coliru

根据C++11 之前的cppreference.com,将调用默认 ctor:

值初始化的效果是:

1) 如果 T 是具有至少一个用户提供的任意类型构造函数的类类型,则调用默认构造函数;

...

这似乎意味着复制 ctor 不一定需要可访问。这是正确的还是不正确的?上面的代码无法编译,因此似乎必须可以访问复制 ctor。

4

1 回答 1

5

值初始化不需要它,但您需要一个可访问的复制构造函数来执行此操作:

X x = X();

那是复制初始化,它需要一个可访问的复制构造函数。即使它不会调用该复制构造函数,它仍然需要存在。

C++17 可能是第一个解除这种需求的版本。

于 2016-01-05T01:53:15.710 回答