代码之家  ›  专栏  ›  技术社区  ›  Edgar Rokjān

Type trait检查类型是否可从stream和MSVC读取

  •  4
  • Edgar Rokjān  · 技术社区  · 6 年前

    最近我遇到 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公司 .

    1 回复  |  直到 6 年前
        1
  •  6
  •   Evg    6 年前

    这里的问题是,msv可以将rValue绑定到左值引用作为语言扩展。编译以下代码:

    struct readable{ };
    
    void foo(readable&)
    { }
    
    void bar()
    {
        foo(readable{});
    }
    

    使用可以使用 /Za