【发布时间】:2021-09-19 03:59:07
【问题描述】:
考虑以下 sn-p:
template<typename T>
int foo(T) {
return 1;
}
struct my_struct{};
template<typename T>
int do_foo(T t) {
return
foo(my_struct{}) + // 1
foo(t); // 2 (via ADL)
}
int foo(my_struct) {
return 2;
}
int main () {
return do_foo(my_struct{});
}
乍一看,对foo 的“非依赖”调用将返回1,而“依赖”调用将返回2。
然而,在标准中我们发现the following paragraph:
如果调用将 <...> 找到更好的匹配项,则在 关联的命名空间考虑了所有函数声明 在所有翻译中这些名称空间中引入的外部链接 单位,而不仅仅是考虑模板中的那些声明 定义和模板实例化上下文,那么程序有 未定义的行为。
不清楚这一段是否只讨论依赖名称查找 - 所以我想知道它是否适用于上述代码,从而使其格式错误。
您能否构造一个例子来说明这一段的意思?
【问题讨论】:
标签: c++ templates language-lawyer