c++ - 为什么我不能将 =default 用于具有成员初始值设定项列表的默认 ctor
问题描述
考虑以下类:
class Foo {
int a, b;
public:
Foo() : a{1}, b{2} {} // Default ctor with member initializer list
//Foo() : a{1}, b{2} = default; // Does not work but why?
};
(编辑:因为它在几个答案中被提到 - 我知道课堂成员初始化器,但这不是重点)
我认为第二个 ctor 定义会更优雅,更适合现代 C++ 代码(另请参阅如果必须明确使用默认语义,为什么应该使用=default
)。但是,似乎没有常见的编译器接受它。而 cppreference 对此保持沉默。
我的第一个想法是成员初始化器列表以某种方式改变了链接的常见问题解答中解释的“默认语义”,因为它可能会或可能不会默认构造成员。但是对于类内初始化器,我们会遇到同样的问题,只是这里Foo() = default;
工作得很好。
那么,为什么不允许呢?
解决方案
= default;
是一个完整的定义。首先,它在语法上是强制执行的:
[dcl.fct.def.general]
1函数定义的形式
功能定义: 属性-说明符-seq opt decl-specifier-seq opt声明符 virt-specifier-seq opt function-body 功能体: ctor-initializer opt复合语句 功能尝试块 = 默认; =删除;
所以它要么是一个带有复合语句的成员初始化列表,要么只是简单= default;
的,没有混搭。
此外,= default
意味着有关如何初始化每个成员的特定内容。这意味着我们明确地希望像编译器提供的构造函数一样初始化所有内容。这与构造函数的成员初始化器列表中的成员“做一些特别的事情”相矛盾。
推荐阅读
- angular - 将 Angular 6 部署到 Heruko 错误
- java - 是否可以在不在 jsp 中创建新会话的情况下将 EL 用于 sessionScoped bean
- java - Apache Gaucamole:与 guacd 的连接在 EC2 机器中超时
- elasticsearch - 如何在elasticsearch中查询特定的源字段
- c# - 如何在 C# 中使用键盘挂钩检测组合键
- vba - VBA代码从url获取附近位置到excel
- pandas - 在 Pandas.read_sql 中使用 Flask_sqlAlchemy Cross 数据库引擎
- java - 在spring控制器中上传带有其他参数的文件
- ios - 使用 +1000 值转换日期
- python - 在橙色中标记要忽略的属性