考虑以下代码段:
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 ::〜类型名称
〜类型名称
〜decltype-specifier
和:
decltype-specifier:
decltype(expression)
decltype(auto)
那么上面的代码片段不是应该按照标准格式吗?(不考虑在同一对象上两次调用析构函数,然后第三次调用析构函数的事实。)
您的程序格式错误。
§7.1.6.4/ [dcl.spec.auto]指出:
使用
auto
或decltype(auto)
在本节中未明确允许使用的上下文中的程序格式错误。
在那里,我找不到任何应该允许您编写的内容。通常,decltype(auto)
仅在变量和函数声明中使用。但是,语法允许的事实并不意味着其格式正确。
因此,如文中所述,f.~decltype(f)()
并没有明确禁止编写和允许类似的内容。GCC无法编译的事实很可能是一个错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句