标准::unique_ptr ostream 插入器

std::unique_ptr ostream inserter

本文关键字:插入 ostream unique 标准 ptr      更新时间:2023-10-16

我已经在 gcc 4.4.6 中使用 -std=c++0x 选项启用了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 插入器正在插入布尔值。

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

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的期望过高?

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

explicit operator bool() const noexcept;

并且不应通过尝试将指针插入 ostream .这应该会导致编译错误,即确切地说,GCC 4.7 上会发生什么。

编辑:gcc 4.4不支持显式转换运算符,因此这在当时不起作用。您应该获得更新的 gcc 版本才能真正使用 C++11。

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