【问题标题】:Explicit destructor call with decltype使用 decltype 显式调用析构函数
【发布时间】:2018-04-05 06:28:32
【问题描述】:

考虑以下 sn-p:

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 :: ~type-name
~ 类型名称
~ decltype-specifier

还有:

decltype-specifier:
decltype ( 表达式 )
decltype ( 自动 )

那么上面的 sn-p 不应该按照标准格式正确吗? (不考虑析构函数在同一个对象上被调用两次然后第三次的事实。)

GCC Live
Clang Live

【问题讨论】:

  • 如果格式正确应该怎么办?
  • @underscore_d 应该调用析构函数吗?该示例不是实际程序。
  • 没关系,但在您的情况下,要使用的语法不是“伪析构函数名称”,而是非限定 ID(形式为“~ decltype-specifier”)和“后缀表达式 ( ... )",其中后缀表达式为 "f."。生产伪析构函数名称仅在类型不是类类型或依赖类型时使用。

标签: c++ c++14 language-lawyer c++17


【解决方案1】:

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

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

在那里,我找不到任何可以让你写这个的东西。通常,decltype(auto) 仅用于变量和函数声明。不过,语法允许的事实并不意味着它的格式正确。

因此,像f.~decltype(f)() 这样的写法并没有被明确禁止,并且在语法中是允许的。 GCC 无法编译它的事实很可能是一个错误。

【讨论】:

  • 那你觉得 f.~decltype(f)() 怎么样。 clang 允许,gcc 不允许。是 gcc 的错吗?
  • decltype(f) 不是decltype(auto)。你的问题是decltype(auto),Jodocus 已经回答了。为什么decltype(f) 不能在这里工作?它不是很有用,但它明确的,没有理由被禁止。
  • @underscore_d 不,我的问题涉及两者,因此为什么两者都存在于代码 sn-p 中。我认为答案回答了我的一半问题。
  • 如果连f.~decltype(f)() 都不允许,那么这里怎么能使用decltype-specifier? ...
猜你喜欢
  • 2013-06-24
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多