=default 忽略访问说明符?

=default ignores access specifier?

我觉得很奇怪,尽管默认构造函数是 private (4.8.1 g++):

,但下面的程序仍然可以正常编译
 class A{
 private:
     A() = default;
     A(const A&) = default;
 };

 int main(){

     A a;

 }

实际上来自标准 (N3242) 的 8.4.2[2]

An explicitly-defaulted function may be declared constexpr only if it would have been implicitly declared as constexpr. If it is explicitly defaulted on its first declaration,

— it shall be public,

..........

默认说明符忽略访问规范的确切目的是什么?我觉得这可能会导致 class 设计师不希望用户创建默认值但需要在实现中使用默认构造函数的界面问题。我想这可能是因为默认构造函数通常是 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 constructors/assignments 不是 public.

这是一个 gcc 错误。 Bug 57913 contains an example almost identical to yours. Bug 56429 contains links to several related bug reports, of which bug 54812 已在 gcc 4.9 中修复,它确实拒绝了您的代码。

error: 'constexpr A::A()' is private

Live demo