= default忽略访问说明符?

我发现很奇怪,尽管默认的构造函数是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错误。 错误57913包含一个与你的几乎完全相同的例子。 错误56429包含指向几个相关错误报告的链接,其中错误54812已在gcc 4.9中修复,确实会拒绝您的代码。

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

现场演示

链接地址: http://www.djcxy.com/p/83737.html

上一篇: =default ignores access specifier?

下一篇: Passing primitive array to function with std::initializer