【问题标题】:Pseudo-destructor call with template keyword使用模板关键字的伪析构函数调用
【发布时间】:2018-04-02 16:14:19
【问题描述】:

以下代码does not compile with clang 5.0.0(编译标志为-std=c++14 -Wall -Wextra -Werror -pedantic-errors -O0):

struct foo
{
};

int main()
{
    foo f;

    f.~decltype(f)();          // OK
    f.template ~decltype(f)(); // OK

    int i{};

    i.~decltype(i)();          // OK
    i.template ~decltype(i)(); // error: expected unqualified-id
}

这是一种强制编译带有template关键字的伪析构函数调用的方法吗?

【问题讨论】:

  • 但是为什么呢?它不是模板。我很惊讶f.template ~decltype(f)(); 编译。您要解决的最终问题是什么,您认为添加 template 关键字会有所帮助?
  • 我也不确定第一个是否应该被接受。无论哪种情况,它都不是模板。
  • @Rakete1111 - 严格来说,decltypefoo 是有效的。很高兴知道 GCC 也有问题:P
  • @Constructor, 最新草案有以关键字template为前缀的名称应为template-id或名称应指类模板或别名模板。 [注意:关键字模板可能不适用于类模板的非模板成员。 — 尾注]
  • 顺便说一句,@chris,这就是答案。你应该把它作为一个发布。

标签: c++ templates destructor explicit-destructor-call pseudo-destructor


【解决方案1】:

据我所知,[temp.names]/5 禁止这两种.template … 查找:

以关键字模板为前缀的名称应为模板ID,或者名称应指类模板或别名模板。 [注意:关键字模板可能不适用于类模板的非模板成员。 ——尾注]

这些析构函数名称都不是template-id,它们也不是类模板或别名模板。但是,我可能遗漏了什么。

【讨论】:

  • f.~decltype(f)();i.~decltype(i)(); 仍然是有效的代码。
  • 有趣的是f.template ~foo(); 在这里给出了一个错误。所以这是 clang 中的一个明显错误(显式析构函数调用 + decltype 混淆编译器)。
  • 哦,是的,这两个是常规的伪析构函数调用。不知道为什么我没有注意到。
  • 更准确地说f.~decltype(f)();是一个常规的显式析构函数调用。
  • 就是这样。我今天有点匆忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2012-07-24
  • 2015-06-04
  • 2023-03-23
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多