gpt4 book ai didi

c++ - 它如何使用 CRTP 将左值引用传递给 std::forward?

转载 作者:行者123 更新时间:2023-11-30 02:25:40 30 4
gpt4 key购买 nike

我用 CRTP(Curiously Recursive Template Pattern)测试了 std::forward。但是我不能将左值传递给它。请阅读以下代码。

#include <algorithm>

struct DataClassA {};

template <typename Derived>
struct ContainerCRTP {
template <typename Element>
void add(Element&& tag) { }
};

struct Container : public ContainerCRTP<Container> { };

int main()
{
DataClassA data_a;
Container container;

// Case 1: passing lvalue. compile error.
container.add<DataClassA>(data_a);

// Case 2: passing rvalue. It succeeds compiling.
container.add<DataClassA>(std::move(data_a));
}

当我在案例 1 中传递左值时,gcc 编译器给我一个编译错误,

template argument deduction/substitution failed:
cannot convert ‘data_a’ (type ‘DataClassA’) to type ‘DataClassA&&’

另一方面,当我在案例 2 中传递右值时,gcc 编译器不会给我编译器错误。

如何将左值赋给 container.add<DataClassA>(data_a)

最佳答案

当你打电话时:

container.add<DataClassA>(data_a);
// ^^^^^^^^^^^

显式提供模板参数意味着编译器不会推导模板参数(即您不会获得转发引用行为)。

DataClassA 作为模板参数实例化 add 意味着它的签名是:

void add(DataClassA&& tag) 

这是一个右值引用,而不是转发引用,因此左值参数不能绑定(bind)到它。

要使用完美转发,您必须让编译器从参数中推导出模板参数。根据参数的值类别,存在三种可能的推导(TT&T&&),这就是 std: :forward 重现参数的值类别:

container.add(data_a);

关于c++ - 它如何使用 CRTP 将左值引用传递给 std::forward?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43976991/

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