Alt*_*irl 4 c++ destructor c++11 c++14
假设我有一些看起来像这样的东西:
struct foo {
~foo() = delete;
}
Run Code Online (Sandbox Code Playgroud)
让我们说我以后动态分配一个类型的对象foo:
foo *f = new foo;
Run Code Online (Sandbox Code Playgroud)
这可以; 我假设合成的默认构造函数用于构造表示的对象f,但是:
foo f2;
Run Code Online (Sandbox Code Playgroud)
给我一个错误:
尝试使用已删除的功能
那么f如果默认构造函数foo被隐式删除,对象如何表示?
而且,假设foo有私人会员size_t n.n动态分配的值是什么foo,例如f?
tem*_*def 10
当你写作
foo f;
Run Code Online (Sandbox Code Playgroud)
编译器需要能够在最初创建时构造f.由于该变量具有自动存储持续时间("堆栈上"的奇特C++术语),因此编译器负责生成代码以进行清理.这需要访问析构函数,但是因为你删除了它,就会出错.
当你写作
foo* f = new foo;
Run Code Online (Sandbox Code Playgroud)
您正在创建一个指向堆栈上foo对象的指针,编译器可以在不访问foo析构函数的情况下销毁指针本身.另一方面,使用new foo创建的对象具有动态存储持续时间,这意味着您承诺手动销毁它.因此,编译器不需要访问析构函数,因此创建步骤很好.那说,如果你再写
delete f;
Run Code Online (Sandbox Code Playgroud)
您应该收到错误,因为该操作确实需要析构函数.
编辑:从你的后续,我的感觉是你想知道为什么即使删除析构函数仍然生成默认构造函数.我有一个C++ 14规范的草案,在§12.1.4中,它说如下:
类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用.如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4).隐式声明的默认构造函数是其类的内联公共成员.如果出现以下情况,则将类X的默认默认构造函数定义为已删除:
- X是一个类似联合的类,它有一个带有非平凡构造函数的变量成员,
- 任何没有大括号或等号初始化程序的非静态数据成员都是引用类型,
- 任何const-qualified类型(或其数组)的非变量非静态数据成员,没有大括号或等于初始化程序,没有用户提供的默认构造函数,
- X是一个联合,它的所有变体成员都是const限定类型(或其数组),
- X是一个非联合类,任何匿名联合成员的所有成员都是const限定类型(或其数组),
- 任何直接或虚拟基类,或没有大括号或等号初始值的非静态数据成员,具有类型M(或其数组),并且M没有应用于M的默认构造函数或重载决策(13.3)默认构造函数导致歧义或在默认默认构造函数中删除或无法访问的函数中,或者
- 任何直接或虚拟基类或非静态数据成员都具有一个类型,该类型具有从默认默认构造函数中删除或无法访问的析构函数.
换句话说,删除析构函数对默认构造函数的自动生成没有影响.
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |