【发布时间】:2019-04-12 23:40:48
【问题描述】:
请看这段代码
class Bond
{
public:
Bond(int payments_per_year, int period_lengths_in_months);
Bond() = default;
private:
const int payments_per_year;
const int period_length_in_months;
};
int main()
{
Bond b; // Error here
}
尝试编译时出现错误:
错误 C2280:“Bond::Bond(void)”:试图引用已删除的函数”。
这不是违反“3 规则”,因为我已经添加了默认构造函数。
为什么编译器不能识别Bond() = default;?
【问题讨论】:
-
我还有其他错误
uninitialized const member in 'const int'。当您初始化常量成员时,不会再产生错误。 -
违反三规则与问题完全无关,无论是否存在(默认)构造函数。
-
= default一个特殊的成员并不意味着它存在,而是隐含的产生了。如果隐式生成的不存在,那么你得到这个。 -
尽管我们很可能从本例中引用的错误中识别出编译器,但任何与“为什么我的编译器”相关的问题都将从指示 which 编译器中受益匪浅,并且哪个版本。