在 C++98/03 中,我们是否需要一个可访问的复制构造函数来进行值初始化?

Do we need an accessible copy constructor for value initialization in C++98/03?

此题只针对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,将调用默认构造函数:

The effects of value initialization are:

1) if T is a class type with at least one user-provided constructor of any kind, the default constructor is called;

...

这似乎暗示复制构造函数不一定需要可访问。这是否正确?上面的代码无法编译,所以似乎复制构造函数 必须 可以访问。

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

X x = X();

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

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