匿名union不能含有成员函数,此时如果匿名union中含有string类型的成员(此时匿名union会生成删除的对应的操作)
如果匿名union嵌套在其他类当中,这个类管理着union类类型的成员的状态,但是union对应的拷贝控制成员都是删除的,嵌套的类对应的成员也应该是删除的(因为匿名union中未定义拷贝操作)
,下面这个类为什么可以?
匿名union不能含有成员函数,此时如果匿名union中含有string类型的成员(此时匿名union会生成删除的对应的操作)
如果匿名union嵌套在其他类当中,这个类管理着union类类型的成员的状态,但是union对应的拷贝控制成员都是删除的,嵌套的类对应的成员也应该是删除的(因为匿名union中未定义拷贝操作)
,下面这个类为什么可以?
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
这只是说如果没有提供,默认实现会是 =delete 。但是,这不能阻止显式提供自己的版本。
而且,这种情况下,由于默认的版本不可用,如果想拷贝/赋值等等,必须自己显式地实现自己的版本。
你必须在 Token 的拷贝构造函数(或其他成员中),决定如何拷贝(或进行其他对应操作)其中的匿名 union 。
=============
“删除的”引起了很多误解,这里澄清一下。仅以拷贝构造为例。
C++17 15.8.1 Copy/move constructors
这里说的很清楚了,只用但没有显式实现的时候,才会默认实现。而默认实现在某些情况下是 deleted 。
而不是直接删除了这个函数,在没有实现的能力。
只要有显式地实现,那么,默认实现(=delete)是不生效的。
当然,这个说的是 Token 类。
==================
后上传的图片(Class A, Class B) 中的问题跟开始的感觉还不太一样,这个设计到一个包含 union 的类怎么析构的问题。
class A 里的不是匿名 union ,它有一个 union 类型的成员。这个成员没有析构函数。class B 里的才是匿名 union。
对 destructor,有如下规定:C++17 15.4 Destructors
一个析构函数,函数执行完之后,要对成员及基类进行析构。只是,成员析构仅会对 non-variant non-static 进行。
Class A 中的成员 A::z 的类型的 union F,这不是一个匿名 union 。 A::z 是一个 non-variant non-static 成员,因而它必须提供自己的析构函数(因为没有默认的,或者说默认的是 =delete),否则 A 的析构就不能完成(A析构是会调用 A::z 的析构)。
但是 B 中确实是一个匿名 union ,这个匿名 union 仅引入了一个 variant member B::f ,在 B 析构的时候,不会调用 variant member B::f 的析构。(B::f 如果需要析构,必须在 ~B 的函数体里显式地进行)。