这个问题仅涉及预C++ 11.考虑以下看似破碎的代码:
struct X { X(){} // default user-provided constructor private: X(const X&){} }; int main() { X x = X(); }
Live on Coliru
根据cppreference.com在预C++ 11中的默认ctor将被调用:
值初始化的效果是:
1)如果T是具有至少一个用户提供的任何类型构造函数的类类型,则调用默认构造函数;
...
这似乎意味着复制文件不一定需要访问.这是否正确?上面的代码不能编译,因此似乎必须可以访问复制ctor .
值初始化不需要它,但是您需要一个可访问的复制构造函数来执行此操作:
X x = X();
这是复制初始化,需要一个可访问的复制构造函数.即使它不会调用该复制构造函数,它仍然需要存在.
C++ 17可能是第一个需要解除此需求的版本.