[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的引用同意。是否有理由 差?
答案 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
[...]除非 否则指定。
......并且上述内容并不是特别允许的。但是,这种未定义的行为很好,可以在没有任何影响的情况下调用。