检查是否可以流式传输类型实例

时间:2014-11-11 20:40:56

标签: c++ c++11 iostream template-meta-programming sfinae

我很长时间以来对这个元功能感到困惑。它似乎工作,但我怀疑它包含UB,当它检查可能未定义的引用类型的大小?这个元函数有问题吗?

template <class S, class C, typename = void>
struct is_streamable : ::std::false_type { };

template <class S, class C>
struct is_streamable<S,
  C,
  decltype(void(sizeof(decltype(::std::declval<S&>() <<
    ::std::declval<C const&>()))))
> : ::std::true_type
{
};

编辑:我的问题(和担忧)的动机是question。他为什么不使用类似的技巧(检查参考类型的大小)?

1 个答案:

答案 0 :(得分:2)

  

检查可能未定义的引用类型的大小时?

永远不会诱导UB。它只会导致演绎失败(根据[temp.deduct] / 8),导致模板被实例化。 [expr.sizeof]:

  

当应用于引用或引用类型时,结果为   引用类型的大小。

  

sizeof运算符不应用于具有的表达式   [...]不完整类型[...]。

但如果全局ostream超载,则string的{​​{1}}被视为“可流式”。
要解决此问题,请将部分特化定义为

operator<<

Demo