请考虑以下最小可复现示例(MCVE):
#include <iostream>
int main()
{
void foo(int);
std::cout << foo << std::endl;
return 0;
}
在这里,我特意以错误的方式打印函数指针,以便选择接受bool
的重载的operator<<。
basic_ostream& operator<<( bool value );
我困惑的是,gcc 7.2和clang 5.0都产生了警告,但编译和链接程序。同时,Visual Studio 15.5.6未链接此示例。个人认为,无论使用哪个编译器,这段代码都不会链接,因为
foo
似乎是 ODR-used 。有人能解释一下为什么 gcc 和 clang 能够链接程序吗?