=default忽略访问说明符

=default ignores access specifier?

本文关键字:访问 说明符 default      更新时间:2023-10-16

我发现很奇怪,尽管默认构造函数是private (4.8.1 g++),下面的程序仍然编译得很好:

 class A{
 private:
     A() = default;
     A(const A&) = default;
 };
 int main(){
     A a;
 }

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

一个显式默认的函数只有在被隐式声明为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 .

这是一个gcc bug。Bug 57913包含一个与您的示例几乎相同的示例。Bug 56429包含几个相关Bug报告的链接,其中Bug 54812已经在gcc 4.9中修复,它确实拒绝了你的代码。

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

现场演示