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>()
应该是不必要的。