在 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();
}
根据 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 可能是第一个取消这种需求的版本。
此题只针对C++11之前的问题。考虑以下看似损坏的代码:
struct X
{
X(){} // default user-provided constructor
private:
X(const X&){}
};
int main()
{
X x = X();
}
根据 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 可能是第一个取消这种需求的版本。