最近我遇到
the question
is_streamable
类型特征。所以我决定实现自己的版本,并提出下一个解决方案来检查是否可以从中读取类型
std::istream
是否:
template<typename, typename = void>
struct is_readable_from_stream_impl
: std::false_type {};
template<typename T>
struct is_readable_from_stream_impl<T,
std::void_t<decltype(std::declval<std::istream&>() >> std::declval<T>())>>
: std::true_type {};
template<typename T>
struct is_readable_from_stream :
is_readable_from_stream_impl<T> {};
template<typename T>
inline constexpr auto is_readable_from_stream_v = is_readable_from_stream<T>::value;
operator>>
:
struct readable {};
std::istream& operator>>(std::istream& is, readable&)
{
return is;
}
static_assert(is_readable_from_stream_v<readable&>);
static_assert(!is_readable_from_stream_v<readable>);
两人都通过了检查
gcc 8.2
clang 6.0.0
,但是
MSVC
rejects
第二个断言。
我想知道我的实现(或测试)是不正确的,还是另一个问题
MSVC公司
.