crayontxx
V2EX  ›  C

求教一个模板类型推导的问题

  •  
  •   crayontxx · Jan 31, 2019 · 3385 views
    This topic created in 2839 days ago, the information mentioned may be changed or developed.
    #include <stdio.h>
    #include <type_traits>
    
    enum class E : int
    {
        A
    };
    
    template<typename T>
    void Test(T&& t)
    {
        if (std::is_enum<T>::value)
            printf("YES\n");
        else
            printf("NO\n");
    }
    
    template<typename T>
    void Test2(T&& t)
    {
        Test(t);
    }
    
    int main() {
        Test(E::A);
        Test2(E::A);
        return 0;
    }
    

    为什么输出结果是:

    YES
    NO
    

    环境 g++ 7.3.0

    AngelCriss
    AngelCriss
    Jan 31, 2019 via Android
    1
    第二个应该 decay 成 int 了
    a41050447
    a41050447
    Jan 31, 2019 via iPhone
    2
    test2 传给 test 的是引用,
    std::is_reference<T>
    加个 std::move
    lniwn
    lniwn
    Jan 31, 2019 via iPhone
    3
    这就是 forward 存在的意义
    crayontxx
    crayontxx
    OP
    Jan 31, 2019
    4
    感谢各位。
    aqtata
    aqtata
    Jan 31, 2019
    5
    退 c++保平安。

    template<typename T>
    void Test2(T&& t)
    {
    Test(std::forward<T>(t));
    }
    wutiantong
    wutiantong
    Jan 31, 2019
    6
    把 Test 的参数改成 const T &可能更符合你的代码意图
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:42 · PVG 15:42 · LAX 23:42 · JFK 02:42
    ♥ Do have faith in what you're doing.