作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
[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
上面的评论似乎表明编译器应该以不同的方式对待上面的名称 g
和 h
的查找,就像 template-id 不会被考虑用于名称 h
。当我用 clang 编译这段代码时,我看不出这种区别或海湾合作委员会。该示例试图传达的确切区别是什么?
最佳答案
您正在查看 C++20 草案,但使用 C++17 编译器进行测试。
Unqualified template name 查找是 P0846R0 引入的新 ADL 功能并被采纳到 C++20 草案中。
所以要尝试一下,请使用带有 -std=c++2a
( link ) 的 GCC 主干:
error: expected primary-expression before '>' token
12 | int z = h<N::A>(N::A()); // error: h< does not begin a template-id
虽然确切的错误信息还不完美,但最终结果是前两次查找成功。
为了比较,请注意 [basic.lookup.unqual]/3 的 C++17 版本不包含您提到的示例。
关于c++ - [basic.lookup.unqual]/3 中的第一个示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619879/
[basic.lookup.unqual]/3 中的第一个示例: int h; void g(); namespace N { struct A {}; template int f(T);
我是一名优秀的程序员,十分优秀!