Rvalue references and std::forward
Rvalue references and std::forward
-
int&& i = 42;
和int i = 42;
之间有什么区别吗? -
关于
std::forward
,我在网上读到"如果arg是一个左值引用,函数返回arg而不修改其类型。"然而,以下代码:
void f(int& k)
{
std::cout << "f(int&) " << k << std::endl;
}
void f(int&& k)
{
std::cout << "f(int&&) " << k << std::endl;
}
int main(void)
{
int i = 42;
int& j = i;
int&& k = 42;
f(i);
f(j);
f(k);
f(std::forward<int>(i));
f(std::forward<int>(j));
f(std::forward<int>(k));
return 0;
}
打印
f(int&) 42
f(int&) 42
f(int&) 42
f(int&&) 42
f(int&&) 42
f(int&&) 42
根据我上面提到的报价,我想知道为什么第4行和第5行不是f(int&) 42
。
- int和amp&i=42;且int i=42
是的。前一个变量是对绑定到临时int
对象的int
的右值引用。Latter变量是一个int
对象。前者是指代对象的一种不必要的复杂方式。
不,在2的上下文中没有区别。你问题的一部分。
- 。。。"如果arg是左值引用,则函数返回arg而不修改其类型。"
这句话本身并不完全准确。假设forward
的模板自变量是从arg
的类型推导出来的。您没有使用推导的类型,而是使用int
,它不会从左值引用中推导出来。
我想知道为什么第4和第5行不是
f(int&) 42
int
不是左值引用,因此引号不适用于第4行。
让我们考虑一下,std::forward
究竟做了什么?它这样做:
Returns: static_cast<T&&>(t).
现在,如果T
是int
,那么它就是static_cast<int&&>(t)
,所以无论t
的类型如何,结果类型都是右值引用。如果使用非左值引用作为std::forward
的类型参数,则其行为与std::move
完全相同。
为了符合报价的假设,你可以做:
f(std::forward<decltype(i)>(i));
f(std::forward<decltype(j)>(j));
f(std::forward<decltype(k)>(k));
这样,输出为:
f(int&&) 42
f(int&) 42
f(int&&) 42
我想说这个函数在这里解释得很好。当在一个可以具有通用引用的上下文中(T&&其中T是为该上下文推导的),forward确保您传递具有相同l/r值特征的参数。
相关文章:
- 完美前进使用 std::forward vs RefRefCast
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- "std::forward"和"std::move"真的不生成代码吗?
- 在C++中使用 std::forward 的多个参数
- 如何使用 std::forward 精确地评估参数包的扩展?
- 普通的右值引用和 std::forward 返回的引用有什么区别?
- 怎么可能写 f( *this, std::forward<Args>(args)... ) 而 f 只用 F f 声明;
- 如何通过通用引用或std::forward将这三个c++模板函数合并为一个
- 自 C++11 年以来对 std::forward 实施的理解
- 当将参数包传递给另一个可变参数模板函数时,我是否必须使用 std::forward
- 为什么要在概念中使用std::forward
- 寻求对std::forward的澄清
- 为什么 std::forward 将左值和右值转换为右值引用?
- std::forward() 的右值引用重载的目的是什么?
- std::forward 如何推断出"_Ty"的类型?
- 没有匹配函数调用 std::forward(const std::string &) 与可变参数
- C++ decltype(auto) or decltype(std::<T>forward(value))?
- std::function operator() 和 std::forward 中发生了什么?
- How to std::forward( *this )
- 在哪些情况下,从 std::forward 分配比从 std::move 分配更可取?为什么