代码之家  ›  专栏  ›  技术社区  ›  bradgonesurfing

为什么我不能在C++中使用带有转发引用的特征呢?

  •  6
  • bradgonesurfing  · 技术社区  · 7 年前

    我有以下测试代码。

    见神栓 https://godbolt.org/z/fLRM8d 对于可执行的示例

    template <typename T> struct Traits {
        static const bool value = false;
    };
    
    struct Zip{};
    template <> struct Traits<Zip> {
        static const bool value = true;
    };
    
    template <typename E>
    void Execute(E && e){
        static_assert(Traits<E>::value);
    }
    
    int main(){
    
        auto z = Zip();
    
        // Fails the static assertion with an lvalue
        Execute(z);
    
        // Passes the static assertion with an rvalue
        Execute(Zip());
    }
    

    这里发生了什么事情,我不能像我所期望的那样使用我的类型特征?模拟这个问题的正确方法是什么?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Vittorio Romeo    7 年前

    在本标准中有一条关于转发引用的扣除的特殊规则。给定转发引用参数 T&& , T 将被推断为 左值引用 如果函数是用 左值 .

    你需要考虑到你的特点:

    Traits<std::remove_reference_t<E>>::value
    

    live example on godbolt.org


    根据标准:

    http://eel.is/c++draft/temp.deduct.call#3

    转发引用是对cv非限定模板参数的右值引用,该参数不表示类模板的模板参数(在类模板参数推导期间([over.match.class.decret]))。如果p是转发引用,参数是左值,则使用类型__对__的左值引用来代替用于类型推导的。