在第一个声明中定义为默认的构造函数被认为不是用户提供的.这基本上就像隐含在C++ 03中一样.聚合类中允许这样的构造函数声明.
struct ag {
ag() = default;
int a;
double b;
};
struct nag {
nag() {}
int a;
double b;
};
ag a = { 5, 12. }; // OK
nag na = { 5, 12. }; // error: not an aggregate and no appropriate constructor
Run Code Online (Sandbox Code Playgroud)
此规则仅= default在类中出现时适用.鉴于此类定义:
struct nag {
nag();
int a;
double b;
};
Run Code Online (Sandbox Code Playgroud)
那么这些构造函数定义确实是完全等价的:
nag::nag() {} // 1
nag::nag() = default; // 2
Run Code Online (Sandbox Code Playgroud)
一个explicit默认的构造函数通常禁用空副本列表初始化语法(= {}),并{}作为一个参数或return值.explicit聚合中的显式默认和默认构造函数容易混淆地遵守此规则,因为聚合初始化具有比构造函数初始化更高的优先级.这提供了一种检测类是否为聚合的方法,但您可能不应该这样做.
struct sadistic {
explicit sadistic() = default;
// members
};
sadistic se = {}; // OK only if sadistic has no virtual functions, etc.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1990 次 |
| 最近记录: |