【发布时间】:2019-12-09 09:35:04
【问题描述】:
简而言之,我试图了解 C++ 中依赖于参数的查找的行为。我不清楚 ISO/IEC 14882:2017 (E) 中关于 ADL 的一些声明。我希望有人能向我澄清。
按照标准,
用于指定类型的 Typedef 名称和 using-declarations 不参与此集合。
和
在考虑关联的命名空间时,查找与执行的查找相同 关联命名空间用作限定符(6.4.3.2),除了:
- 关联命名空间中的任何 using-directive 都将被忽略...
对我来说,这些陈述意味着 ADL 应该完全忽略任何 typedef 或 using 的出现。可能情况并非如此。考虑以下示例:
#include <iostream>
using namespace std;
namespace N2
{
struct B {};
template <typename T>
void func (const T&) {cout << __PRETTY_FUNCTION__ << endl;}
};
namespace N
{
typedef N2::B C;
}
void tfunc (N::C) {}
int main ()
{
func(tfunc);
}
它有效,即编译器能够找到func。那么,这些标准中的引用实际上是什么意思?
【问题讨论】:
标签: c++ templates language-lawyer argument-dependent-lookup