Wal*_*ldB 5 c++ language-lawyer
[basic.lookup.unqual]/3中的第一个例子:
int h;
void g();
namespace N {
struct A {};
template <class T> int f(T);
template <class T> int g(T);
template <class T> int h(T);
}
int x = f<N::A>(N::A()); // OK: lookup of f finds nothing, f treated as template name
int y = g<N::A>(N::A()); // OK: lookup of g finds a function, g treated as template name
int z = h<N::A>(N::A()); // error: h< does not begin a template-id
Run Code Online (Sandbox Code Playgroud)
上面的注释似乎表明编译器应该对名称g和h上面的查找进行不同的处理,就好像模板ID不会被考虑用于名称一样h.当我用clang或GCC 编译这个片段时,我看不出这种差异.这个例子试图传达的区别是什么?
您正在查看 C++20 草案,但使用 C++17 编译器进行测试。
非限定模板名称查找是P0846R0引入的一项新 ADL 功能,并被 C++20 草案采用。
因此,要尝试一下,请使用 GCC trunk 和-std=c++2a(链接):
error: expected primary-expression before '>' token
12 | int z = h<N::A>(N::A()); // error: h< does not begin a template-id
Run Code Online (Sandbox Code Playgroud)
尽管确切的错误消息尚不完美,但最终结果是前两次查找成功。
为了进行比较,请注意[basic.lookup.unqual]/3的 C++17 版本不包含您提到的示例。