private
尽管默认构造函数是(4.8.1 g++),但以下程序仍然编译得很好,我发现这很奇怪:
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
实际上来自标准的 8.4.2[2] (N3242)
只有当它被隐式声明为 constexpr 时,才可以将显式默认函数声明为 constexpr。如果它在第一个声明中被明确默认,
——它应该是公开的,
…………
默认说明符忽略访问规范的目的到底是什么?我觉得这可能会导致类设计器不希望用户创建默认值但在实现中需要默认构造函数的接口问题。我认为这可能是因为默认构造函数是正常public
的,因此default
旨在复制它 - 但这并不能回答为什么=default
复制构造函数不会忽略private
规范。
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
A b(a); //error: constexpr A::A(const A&) is private
}
实际上,我无法从标准中看到它提到没有明确默认的copy/move
构造函数/赋值public
。