c++ - 未定义、删除、未声明的函数

标签 c++ c++11

我在这里使用默认构造函数作为示例,但同样的问题也适用于所有特殊成员函数。

此外,我正在使用https://en.cppreference.com而不是标准,因为那是我正在阅读的内容,也是我无法理解的内容。如果使用该标准会以任何方式改变问题,请告诉我。

<小时/>

https://en.cppreference.com/w/cpp/language/default_constructor 中所述,如果一个类没有构造函数,那么编译器将始终声明一个默认构造函数。然后,如果不满足某些条件,它将是未定义的(c++ 11之前)或定义为已删除(c++ 11之后)。

所有这些似乎都暗示函数未声明、声明但未定义或声明并删除之间存在区别。但是,所有三个选项都不会编译/链接,例如

class MyClass {
public:
    void foo();
    void bar() = delete;
};

int main() {
    MyClass c;
    //c.foo();  // won't link
    //c.bar();  // won't compile
    //c.baz();  // won't compile
}

那么为什么将定义从“声明和未定义”更改为“声明和删除”如此重要,为什么不首先将其保留为“未声明”呢?

最佳答案

So why is it so important to change the definition from "declared and undefined" to "declared and deleted"

因为差异:“不会链接” vs “不会编译”。这是引入 =delete 的根本原因:在编译时(而不是稍后)捕获使用(以前的)未定义函数的错误。此外,它还可以更好地进行错误诊断,因为编译器将能够描述函数被删除的原因。链接器最多只能说,没有人出于某种未知的原因定义它。

没有理由不利用隐式生成的成员函数的功能。

关于c++ - 未定义、删除、未声明的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58504628/

相关文章:

c++ - 现代 C 和 C++ : it is possible to use one defined structure for other declared structure?

按值或按(常量)引用返回原语的 C++ 性能

c++ - 为 STL 容器重载 operator<<()

C++ 和模块化 : Where am I supposed to draw the line?

c++ - 静态变量没有被初始化 - 有时?

c++ - 它是 C++11 中互锁单链表的正确实现吗

c++ - 通过 Qt C++ 中的键访问解析的嵌套 JSON

c++ - 为什么 array<T, N> 会比 vector<T> 慢?

c++ - 如果在 Xeon Phi 上编译时不知道循环计数,则性能会下降

c++ - C++ 代码可以在 C++03 和 C++11 中都有效但做不同的事情吗?