=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]
一个显式默认的函数只有在被隐式声明为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
现场演示
相关文章:
- 函数模板签名中忽略的成员类型def 的访问说明符
- C++ 访问说明符理解
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 访问说明符和性能
- 访问说明符外部的 C++ 类成员
- 在scons中将访问说明符从private更改为public
- 使用Astmatcher获得至少两个相同访问说明符的课程
- 内联访问说明符出现语法问题
- 为什么C 标准专门为具有不同访问说明符的类数据成员的内存布局提供了余地
- 访问has-a关系的访问说明符
- 访问说明符不会更改可访问性级别.这是什么意思
- 关于C++中的访问说明符
- 关于访问说明符的困惑
- 类定义中的宏相关访问说明符是否会导致未定义的行为
- 为什么虚函数无视访问说明符?C++
- 模拟 C 中的访问说明符
- 访问说明符对好友函数是否重要
- 细粒度访问说明符 c++
- 对基于访问说明符的特定重载函数使用声明
- 在C++中,do访问说明符不控制静态成员的可见性