我很长时间以来对这个元功能感到困惑。它似乎工作,但我怀疑它包含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。他为什么不使用类似的技巧(检查参考类型的大小)?
答案 0 :(得分:2)
检查可能未定义的引用类型的大小时?
永远不会诱导UB。它只会导致演绎失败(根据[temp.deduct] / 8),导致主模板被实例化。 [expr.sizeof]:
当应用于引用或引用类型时,结果为 引用类型的大小。
sizeof
运算符不应用于具有的表达式 [...]不完整类型[...]。
但如果全局ostream
超载,则string
的{{1}}被视为“可流式”。
要解决此问题,请将部分特化定义为
operator<<