当依赖稍后定义的函数时,我注意到有关函数查找的奇怪行为:
#include <iostream>
template <typename T>
void foo(const T&)
{
std::cout << "Basic" << std::endl;
}
template <typename T>
void bar()
{
T x;
foo(x);
}
void foo(const int& x)
{
std::cout << "int:" << x << std::endl;
}
int main()
{
bar<int>();
}
输出:
Basic
出于某种原因,我希望使用foo
insidebar
来找到它下面的重载。将 的重载foo
移到上面bar
使输出成为所需的int:0
(或只是编写一个声明)。
同样的行为似乎不适用于重载二元运算符:
#include <iostream>
struct Foo {} foo;
template <typename T>
void operator<<(const Foo&, const T&)
{
std::cout << "Basic" << std::endl;
}
template <typename T>
void bar()
{
T x;
foo << x;
}
void operator<<(const Foo&, const int& x)
{
std::cout << "int:" << x << std::endl;
}
int main()
{
bar<int>();
}
输出:
int:0
我有两个问题,第一个是:为什么会有这样的行为,为什么运算符重载会有所不同?第二个是:如果我有一个命名函数(比如我对 的使用foo
),有没有办法编写一个函数bar
来发现foo
稍后在翻译单元中声明的重载 s?