16

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

4

1 回答 1

15

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

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

现场演示

于 2015-10-16T21:59:58.030 回答