为什么没有运营商<<对于std :: unique_ptr?

时间:2014-12-10 08:48:10

标签: c++ c++11 language-lawyer unique-ptr

C ++ 11标准中的

[util.smartptr.shared.io]强制要求operator<< shared_ptr S:

template<class E, class T, class Y>
basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p);

然而,除非我错过了它,否则我在[unique.ptr]中看不到类似的东西 关于en.cppreference.com的引用同意。是否有理由 差?

1 个答案:

答案 0 :(得分:7)

  

是否存在差异的原因?

不,没有。就像make_unique一样,这是一个&#34;监督&#34;并且应该在将来添加(如果有人可能会打扰提交提案) 在此期间,您可以输出ptr.get(),或者 - 如果不害怕未定义的行为:

#if __cplusplus <= 201600 // Some time in future
namespace std {
    template <class E, class T, class Y, class D>
    basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os,
                                     unique_ptr<Y, D> const& p) {
        return os << p.get();
    }
}
#endif

根据[namespace.std]:

未定义
  

如果C ++程序添加了声明或定义,则它的行为是未定义的   命名空间std [...]除非   否则指定。

......并且上述内容并不是特别允许的。但是,这种未定义的行为很好,可以在没有任何影响的情况下调用。