gpt4 book ai didi

c++ - std::forward 实现之间的区别

转载 作者:行者123 更新时间:2023-11-27 22:46:27 24 4
gpt4 key购买 nike

最近我一直在尝试理解 move 语义并想出了一个问题。

问题已经讨论过了here .

我实现了第一个变体并检查它返回的是左值还是右值:

#include <iostream>
using namespace std;

template <typename T>
T&& my_forward(T&& x) {
return static_cast<T&&> (x);
}

int main() {
int a = 5;
&my_forward(a); // l-value
return 0;
}

因此,如果我传递左值,它会返回左值(编译,因为我可以从左值获取地址),如果我这样做:

&my_forward(int(5)); // r-value with int&& type

我的代码没有编译,因为 my_forward 返回了右值。在上面的问题中,他们说此实​​现与标准实现之间的区别(分别使用 std::remove_reference 和 2 个不同的 & 和 && 参数)是我的实现始终返回左值,但正如我所展示的返回右值和左值。

所以我想知道,为什么我不能像那样实现 std::forward?在什么具体情况下,它会显示标准之间的差异?另外,为什么我要将 T 指定为模板,而不能让它用参数类型定义自己?

最佳答案

尝试在真实环境中像 std forward 一样处理它。你的不行;

void test(std::vector<int>&&){}

template<class T>
void foo(T&&t){
test(my_forward<T>(t));
}

foo( std::vector<int>{} );

以上不编译。它与 std::forward 一起使用。

除了 block 引用生命周期延长之外,您的转发没有任何用处。同时,std::forward 是一个有条件的 std::move

所有有名字的都是左值,但是向前 move 带名字的右值引用。

具有名称的右值引用是左值。

关于c++ - std::forward 实现之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329230/

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