clang中的显式调用伪析构函数

时间:2014-03-11 16:33:10

标签: c++ clang

我正在尝试调用显式伪析构函数:

namespace ns {
    template<typename D>
    struct bar {};
}

template <typename T>
void example(T x)
{
    ns::bar<T>().~NoWay<T>();
}

Clang ++(版本3.3)编译此代码时没有任何错误。但是NoWay没有在代码中定义。这是正确的行为吗?

1 个答案:

答案 0 :(得分:2)

我现在同意Potatoswatter :)该计划格式不正确:

[temp.names / 4

  

后缀表达式或[...]中的.->之后显示成员模板专精的名称时,以及<的对象表达式em> postfix-expression 与类型有关   或[..],成员模板名称必须以关键字template作为前缀。   否则,假定该名称命名非模板。

非模板意味着<中的NoWay<T>将被解析为小于,而 typedef-name (和~也是非法的,可能是命名但不是调用析构函数。)

有人会认为在这里添加template

ns::bar<T>().template ~NoWay<T>();

会使它格式良好。部分template ~NoWay<T>确实可以是有效的伪析构函数名称,[expr.post] / 1

  

伪析构函数名:
   nested-name-specifier opt type-name :: ~ type-name
  嵌套名称说明符 template simple-template-id :: ~ type-name
   nested-name-specifier opt ~ type-name

但只有在template之前有嵌套名称说明符时(注意:它不是可选的!)。