这是代码:
#include <iostream>
#include <iomanip>
#include <typeinfo>
#if 0
std::ostream &foo(std::ostream &os, std::ios_base &(*x)(std::ios_base &), bool show_id = false)
{
if ( show_id )
os << "(" << typeid(x).name() << ") ";
return os << x;
}
#endif
template<typename T>
std::ostream &foo(std::ostream &os, T const &t, bool show_id = false)
{
if ( show_id )
os << "(" << typeid(t).name() << ") ";
return os << t;
}
int main()
{
foo(std::cout, std::hex) << 255 << std::endl;
foo(std::cout, ".") << std::hex << 255 << std::dec << std::endl;
foo(std::cout, std::hex, true) << 255 << std::endl;
}
使用 bcc32 6.70 和 bcc32 5.82,输出为
401358255
.ff
(std::ios_base & (*)(std::ios_base &) const) 401368255
使用 bcc64 6.70(基于 clang)和 g++ 4.8.2,输出为
ff
.ff
(FRSt8ios_baseS0_E) ff
我认为 clang 和 gcc 是正确的,因为它们的声誉比 bcc32 好。
如果我启用注释掉的功能,那么 bcc32 输出:
ff
.ff
(std::ios_base & (*)(std::ios_base &)) ff
第一个版本到底出了什么问题?这可能是与重载解析有关的编译器错误,但我无法弄清楚 bcc32 在做什么,或者输出const
末尾是什么typeid
。