当编译和运行代码两相名称查找:POD中与自定义类型
#include <iostream>
struct A { A(int){} };
void foo(int) { std::cout << "foo(int)" << std::endl; }
template< typename T >
struct S {
void bar() { foo(5); }
void foobar() { T t = 5; foo(t); }
};
inline void foo(A) { std::cout << "foo(A)" << std::endl; }
inline void foo(double) { std::cout << "foo(double)" << std::endl; }
int main(int argc, char* argv[])
{
S<double> s0;
s0.bar();
s0.foobar();
std::cout << '\n';
S<A> s1;
s1.bar();
s1.foobar();
}
我得到的输出(使用克++ 4.8,铛++ 3.2或ICPC 13.1)
foo(int)
foo(int)
foo(int)
foo(A)
虽然最后两行对于考虑两阶段查找规则的我来说非常有意义,我预计前两行为foo(int) foo(double)
。
看来,在这种情况下,对于foobar()
调用foo()
在实例化之前得到查询,这应该是不可能的。任何提示?
我认为这实际上是强制性的。 IIRC,如果查找'foo'在使用点和实例化点上给出不同的结果,那么就是UB,不需要诊断。 – MSalters
当然,我可以更改代码并得到不同的结果,但问题是,为什么上面的代码正常工作。 – proto
'foo'没有依赖于模板参数的参数,所以'foo'声明必须可用',所以不能同时解析S :: foo函数(非依赖名称) – Kiroxas