【发布时间】: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 - 严格来说,
decltype的foo是有效的。很高兴知道 GCC 也有问题:P -
@Constructor, 最新草案有以关键字template为前缀的名称应为template-id或名称应指类模板或别名模板。 [注意:关键字模板可能不适用于类模板的非模板成员。 — 尾注]
-
顺便说一句,@chris,这就是答案。你应该把它作为一个发布。
标签: c++ templates destructor explicit-destructor-call pseudo-destructor