伪destructor-name对非类和非枚举类型有意义吗?
Does pseudo-destructor-name make a sense for non-class and non-enum type?
引用c++ 14最终工作草案N3797的5.2.4/1:
在点后面使用伪析构函数。或者是箭头->操作符表示由type-name表示的非类类型的析构函数或decltype-specifier。
- 对于什么类型我们可以考虑
pseudo-destructor-name
,它是enum类型的吗?
是否仅为enum类型 ?
不,伪析构函数调用对任何类型都有效。
但是……这个吗?
enum Foo : int { ... };
typedef int Bar;
Foo a; a.~Foo (); // (1), legal
int b; b.~Bar (); // (2), legal
int c; c.~decltype(c) (); // (3), legal
int d; d.~int (); // (4), ill-formed... why?
<一口>一口>
看起来很奇怪,(4)是病态的,其他的都是合法的;在所有情况下,在int
上调用伪构造函数调用的意图不是吗?
- 什么是类型名,它的定义如何影响前面编写的代码片段?
类型名称的定义可在[dcl.type.simple]p1
中找到,并且表示类型名称是;
- a 类名或;
- an enum-name或;
- a typedefine -name或;
- simple-template-id 。
注意上面的列表不包括基本类型,这就是为什么(4)是病态的,而(3)不是;即使在这两种情况下我们都在int
上调用伪析构函数调用。
int
是类型的名称,但它不是类型名称。
就像文本所说的,它适用于所有类型,除了类类型。在需要显式调用析构函数的极少数情况下,伪析构函数调用的可能性使得不必担心类型是否为类类型。如果它是一个类类型,你将调用实际的析构函数;它不会是一个伪析构函数调用。如果它不是类类型,则表达式是安全的,没有作用。
相关文章:
- C++有多少类型的循环
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 从头开始为应用程序创建 docker 映像是否有意义?
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 在c++中,如果首先禁止默认构造,那么禁止复制构造有意义吗
- 为什么我得到表达式必须有类类型错误?
- sizeof(函数)有意义吗?
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 标准库中会有算术类型的概念C++吗?
- 插入向量时,使用lambda的返回而不是函数的返回是否有意义?
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 基础类模板参数的有意义名称
- 内联这个函数,确实有意义
- C++是否有单位类型
- 如何将略有不同类型视为C 中的类型
- 有了C++类型特征,有没有办法避免铸造
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 使用静态强制转换时,强制转换为类类型或对象引用是否更有意义
- 伪destructor-name对非类和非枚举类型有意义吗?