首页 > 解决方案 > 为什么我不能将 =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;工作得很好。

那么,为什么不允许呢?

标签: c++c++11language-lawyerdefault-constructorctor-initializer

解决方案


= default;是一个完整的定义。首先,它在语法上是强制执行的:

[dcl.fct.def.general]

1函数定义的形式

功能定义:
    属性-说明符-seq opt decl-specifier-seq opt声明符 virt-specifier-seq opt function-body

功能体:
    ctor-initializer opt复合语句
    功能尝试块
    = 默认;
    =删除;

所以它要么是一个带有复合语句的成员初始化列表,要么只是简单= default;的,没有混搭。

此外,= default意味着有关如何初始化每个成员的特定内容。这意味着我们明确地希望像编译器提供的构造函数一样初始化所有内容。这与构造函数的成员初始化器列表中的成员“做一些特别的事情”相矛盾。


推荐阅读