【问题标题】:std::unique_ptr ostream inserterstd::unique_ptr ostream 插入器
【发布时间】:2012-05-18 04:01:04
【问题描述】:

我在 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 插入器正在插入 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 的期望过高?

【问题讨论】:

  • 不应该这样。 unique_ptrbool 的转换应该标记为explicit

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


【解决方案1】:

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

explicit operator bool() const noexcept;

并且不应该通过尝试将指针插入到 ostream。这应该会导致编译错误,即 究竟在 gcc 4.7 上会发生什么。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 但这不是应该发生的。运算符应该是显式的,并且这里不应该有任何转换。这是一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多