我正在尝试调用显式伪析构函数:
namespace ns {
template<typename D>
struct bar {};
}
template <typename T>
void example(T x)
{
ns::bar<T>().~NoWay<T>();
}
Clang ++(版本3.3)编译此代码时没有任何错误。但是NoWay
没有在代码中定义。这是正确的行为吗?
答案 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
之前有嵌套名称说明符时(注意:它不是可选的!)。