合格的非成员函数析构器定义中,是否在作用域内有类模板名称?

时间:2021-08-12 04:37:51

标签: c++ templates clang clang++

clang 的最新版本(自clang-11以来)在编译时使用-pedantic标志会发出警告,对于以下代码段:

namespace foo {
    template <int A>
    struct Bar {
        ~Bar();
    };
} // namespace foo

template <int A>
foo::Bar<A>::~Bar(){}

生成的警告(在使用-Werror时会变为错误)如下所示:

<source>:10:12: error: ISO C++ requires the name after '::~' to be found in the same scope as the name before '::~' [-Werror,-Wdtor-name]
foo::Bar<A>::~Bar(){}
~~~~~~~~~~~^~
           ::Bar

Live Example

clang是我见过的第一个发出此诊断的编译器,根据我所知,上述代码完全有效的 C++。两种不同的方法似乎可以抑制此警告:要么在同一命名空间中定义,要么显式限定析构函数名称 --- 例如:

...
template <int A>
foo::Bar<A>::~Bar<A>(){}

**Clang 在此处的诊断是否正确?**根据我的理解,类型名称绝对位于正确的名称范围内(例如:foo::Bar<A>::~),并且限定符~Bar<A>()应该是不必要的。

0 个答案:

没有答案