为流操作器选择了错误的重载

时间:2014-04-29 10:02:07

标签: c++ operator-overloading c++builder overload-resolution c++builder-xe6

以下是代码:

#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正在做什么,或者consttypeid输出的末尾是什么。

0 个答案:

没有答案