【发布时间】:2014-10-31 05:18:00
【问题描述】:
代码:
struct A
{
~A(){ };
};
A::A(){ }; //error: definition of implicitly declared default constructor
int main()
{
A a;
}
为什么代码会产生错误?我希望程序编译得很好。标准说N3797::12.8/7 [class.copy]:
如果类定义没有显式声明一个副本 构造函数,一个是隐式声明的。如果类定义 声明一个移动构造函数或移动赋值运算符, 隐式声明的复制构造函数被定义为已删除;否则, 它被定义为默认值(8.4)。 如果 类有一个用户声明的复制赋值操作符或一个用户声明的 析构函数。
这是一个错误还是我的误解?
【问题讨论】:
-
你只能为你自己声明的函数提供定义......没有为隐式声明的函数提供非内联体这样的事情
-
@MattMcNabb 是的,我已经从答案中理解了。但是将这些功能标记为默认值有什么意义。它们已经由编译器声明了。
-
@DmitryFucintv:没有必要(假设你没有做任何导致函数被删除的事情)。有些人这样做是因为他们想非常明确地说明他们的类中可用的功能。很多人不赞成隐式声明的函数,而是希望每个函数都必须是显式的。
-
这与您刚刚发布的问题完全不同。 (a) 将其标记为默认意味着该函数在它可能不存在时存在(例如,具有用户声明的析构函数的类的移动构造函数); (b) 自我证明
-
@DmitryFucintv:你误会了......它可以是删除或默认或用户定义的。您引用的文本仅使用 "defined as defaulted* 作为隐式定义的复制构造函数行为的简写。
标签: c++ constructor default-constructor