std::forward 在参数传递中的用法是什么?
What is the usage of std::forward in parameter passing?
请参阅下面的代码段(请注意,s 是一个带有 char 而不是字符串的数组):
#include <string>
#include <iostream>
#include <utility>
void func(std::string & s, char a) {
std::cout << "here1" << std::endl;
// ...
}
void func(std::string && s, char a) {
std::cout << "here2" << std::endl;
// ...
}
template <class T>
void foo(T && s) {
std::cout << "foo2" << std::endl;
func(s, ':');
//func(std::forward<T>(s), ':');
}
int main(int agrc, char *argv[])
{
//std::string s("a:b:c:d");
char s[8] = "abcdefg";
foo(std::move(s));
std::string s2("abcd")
foo(s2);
return 0;
}
如果我使用std::forward
替换func(s, ':')
,这没有区别,在这种情况下,foo 函数将无std::forward
地进行省长转发。
C++11 中对std::forward
的"省长转发"是否存在误解?
这是有区别的。在您的情况下func(s, ':')
只会调用引用std::string
的func
重载。
问题是命名变量和参数本身就是左值,这也是std::forward
首先存在的原因。
在您的示例中,即使您不使用std::forward
,它也会在第一次调用foo
时选择正确的重载。这只是因为您实际上使用char[]
参数调用foo
,该参数用于隐式构造临时std::string
。
让我们考虑第一种情况foo(std::move(s))
。在foo
内部,s
将被绑定到右值。但是由于它有一个名字(s
),它不再是一个右值了。因此,当您将s
传递给func
时,就像将 lvalue 传递给它一样 - 它将触发here1
版本。但是,如果您通过std::forward
传递s
,它将再次成为正确的值。
在第二种情况下s
输入foo时是左值引用,因此无论您直接传递还是通过std::forward
传递它,它都不会更改任何内容。您需要使用std::move
再次从s
中获取右值。
相关文章:
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 使用 MSVC 编译时,msdpb* 文件的正确用法是什么?
- 引用和指向常量的指针的用法是什么
- 在这个C++代码中捕获的用法是什么
- constexpr 标准函子的正确用法是什么?
- ./lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a 的用法是什么
- std::forward 在参数传递中的用法是什么?
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- while(1)的用法是什么
- 逆方差的常见编程用法是什么?
- catch站点中异常的常见用法是什么
- ()运算符的这种特殊用法是什么意思
- 逗号运算符的正确用法是什么
- "!!"(否定两次)的用法是什么?
- CMake "project"指令的正确用法是什么
- “(无效)D”的用法是什么
- 在 C 语言中 &(AND) 运算符的用法是什么?
- 函数体中变量强制转换为 void 的这种用法是什么?
- std::unique_ptr 在推送到 std::vector 时的正确用法是什么?
- 取代snprintf(3)的c++习惯用法是什么?