使用decltype的显式析构函数调用

代代

考虑以下代码段:

struct Foo {};

int main()
{
   Foo f;
   f.~decltype(f)(); // fine with clang, error with gcc
   f.~decltype(auto)(); // error with both clang and gcc 
}

显式析构函数调用的规则由标准语法处理,pseudo-destructor-name其定义如下:

伪析构函数名称:
嵌套名称说明符opt类型名称::〜类型名称
嵌套名称说明符模板simple-template-id ::〜类型名称
〜类型名称
〜decltype-specifier

和:

decltype-specifier:
decltype(expression)
decltype(auto)

那么上面的代码片段不是应该按照标准格式吗?(不考虑在同一对象上两次调用析构函数,然后第三次调用析构函数的事实。)

GCC Live
Clang Live

乔多克

您的程序格式错误。
§7.1.6.4/ [dcl.spec.auto]指出:

使用autodecltype(auto)在本节中未明确允许使用的上下文中的程序格式错误。

在那里,我找不到任何应该允许您编写的内容。通常,decltype(auto)仅在变量和函数声明中使用。但是,语法允许的事实并不意味着其格式正确。

因此,如文中所述,f.~decltype(f)()并没有明确禁止编写和允许类似的内容。GCC无法编译的事实很可能是一个错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

显式调用析构函数

显式调用子析构函数是否也调用父析构函数

如何显式调用 std 迭代器的析构函数?

C ++:显式调用模板参数的typedef的析构函数

为什么不能在析构函数可以的同时显式调用构造函数?

根据C ++标准,显式调用构造函数和析构函数是否安全?

显式调用基类的析构函数/构造函数合法吗?

Python继承:是否必须显式调用parent构造函数和析构函数?

在C ++中从构造函数中显式地调用析构函数是不好的做法吗?

显式调用`int`析构函数-为什么需要类型别名?

什么时候需要进行显式的析构函数调用?

我需要在这里显式调用析构函数吗?

我是否需要显式调用基本虚拟析构函数?

C ++析构函数-继承上下文中的显式调用

如何显式调用命名空间限定的析构函数?

为什么显式调用析构函数会导致双重释放?

隐式使用析构函数

析构函数调用

通过显式调用其析构函数和构造函数来重新创建对象

显式调用模板参数类型的析构函数,即使在内置函数上实例化时也是如此

C++11:我可以显式调用基类析构函数来销毁派生类吗?

C ++:未使用嵌入式模板调用析构函数

虚拟析构函数更改decltype的行为

从析构函数调用BeginInvoke

删除从析构函数调用的引发析构函数

为什么带有auto_ptr和显式析构函数的struct无法交换

使用Vector创建对象时如何调用析构函数

析构函数使用静态对象调用两次

是否允许显式调用析构函数,然后将新变量放置在具有固定生命周期的变量上?