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

bra*_*ing 6 c++ type-traits perfect-forwarding c++11

我有以下测试代码.

有关可执行示例,请参阅godbolt 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());
}
Run Code Online (Sandbox Code Playgroud)

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

Vit*_*meo 7

关于在标准中扣除转发参考,有一条特殊规则.给定转发引用参数T&&,如果使用左值调用函数,T则将推导为左值引用.

你需要在你的特质中考虑到这一点:

Traits<std::remove_reference_t<E>>::value
Run Code Online (Sandbox Code Playgroud)

godbolt.org上的实例


从标准:

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

转发引用是对cv-unqualified模板参数的rvalue引用,该参数不表示类模板的模板参数(在类模板参数推断期间([over.match.class.deduct])).如果P是转发引用且参数是左值,则使用类型"对A的左值引用"代替A来进行类型推导.