gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:22 25 4
gpt4 key购买 nike

我有以下测试代码。

参见神栓 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());
}

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

最佳答案

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

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

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

live example on godbolt.org


来自标准:

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

A forwarding reference is an rvalue reference to a cv-unqualified template parameter that does not represent a template parameter of a class template (during class template argument deduction ([over.match.class.deduct])). If P is a forwarding reference and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction.

关于c++ - 为什么我不能在 C++ 中使用带有转发引用的特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com