std :: unique_ptr ostream inserter

时间:2012-05-10 15:29:40

标签: c++ c++11 ostream unique-ptr

我使用-std = c ++ 0x选项在gcc 4.4.6中启用了unique_ptr。它似乎工作得很好,正是我所需要的 - 带有自定义删除器的范围指针。

但是我注意到了一个问题。

typedef std::unique_ptr<X> XPtr;

XPtr ptr1(new X);
XPtr ptr2(new X);

std::cout << "ptr1 points to " << ptr1 << std::endl;
std::cout << "ptr2 points to " << ptr2 << std::endl;

显示:     ptr1指向1     ptr2指向1

我认为ostream插入器正在插入bool值。

以下修复了它,但我想知道这不应该是标准库的一部分。

template<typename Target, typename Deleter>
std::ostream & operator <<( std::ostream & out, const std::unique_ptr<Target, Deleter> & value)
{
    // output the raw pointer
    out << value.get();
    return out;
}

所以问题是:这是gcc中当前unique_ptr实现的限制,还是我对unique_ptr的期望过高?

2 个答案:

答案 0 :(得分:4)

这似乎是gcc 4.4.6附带的库中的一个错误。转换是

explicit operator bool() const noexcept;

并且不应该通过尝试将指针插入到触发器中来触发 ostream。这应该导致编译错误,即 正是在gcc 4.7上发生了什么。

编辑: gcc 4.4不支持显式转换运算符,因此当时无效。你应该得到一个更新的gcc版本来真正使用C ++ 11。

答案 1 :(得分:1)

unique_ptr已定义operator bool() const,因此您看到的是unique_ptr对象被转换为bool值。如您所发现,要打印指针的地址,您需要使用get()方法。