[basic.lookup.unqual]/3中的第一个例子

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)

上面的注释似乎表明编译器应该对名称gh上面的查找进行不同的处理,就好像模板ID不会被考虑用于名称一样h.当我用clang或GCC 编译这个片段时,我看不出这种差异.这个例子试图传达的区别是什么?

rus*_*tyx 4

您正在查看 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 版本不包含您提到的示例。