STD ::前向和模板类型扣除
Std::forward and template type deduction
我已经编写了以下小程序,以了解std :: forward的工作方式。
#include <iostream>
#include <memory>
template<class T>
void foo3(T&& bar){
std::cout<<"foo3&&"<<std::endl;
}
template<class T>
void foo3(T& bar){
std::cout<<"foo3&"<<std::endl;
}
template<class T>
void foo(T&& bar){
std::cout<<"foo&&"<<std::endl;
foo3(std::forward<T>(bar));
}
template<class T>
void foo(T& bar){
std::cout<<"foo&"<<std::endl;
foo3(std::forward<T>(bar));
}
int main(int argc, char * argv []){
int i = 1;
foo(2);
foo(i);
return 0;
}
我希望以下输出:
"foo&&"
"foo3&&"
"foo&"
"foo3&"
但是,我得到以下结果,我无法解释:
"foo&&"
"foo3&&"
"foo&"
"foo3&&"
因此,如果使用lvalue调用foo,我希望foo将转发LVALUE并调用Foo3的LVALUE版本。但是,所有时间foo3(t&amp;&amp;)被调用。我对std ::前进的工作方式完全错误或有微妙的错误了解吗?甚至更糟糕的是,该代码应该按照我的预期工作,也许我弄乱了编译器的实施?btw.i'm使用G 7.2
我是否理解std ::前进的工作完全错误
是。std::forward
用于转发参考,而void foo(T&)
中的bar
不是。如果您不尊重这一点,您会得到一些奇怪的行为。
了解为什么您需要了解std::forward
实际上做什么。这只是一个演员
static_cast<T&&>(t)
其中t
是std::forward
的参数。因此,foo
的最后呼叫看起来像这样:
std::cout<<"foo&"<<std::endl;
foo3(std::forward<int>(bar));
T
被推荐为 int
,如果看一下演员阵容,您会发现它会将 bar
铸成rvalue参考,而不是像您预期的那样的lvalue参考。
相关文章:
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误:无法传递非平凡类型"std::string"的对象和更多错误
- 与'operator<<'不匹配(操作数类型'std::ostream {aka std::basic_ostream<char>}'
- std::函数指针错误:无法将 &A::a 转换为类型 std::function<>&&
- 包括<字符串>,使用不完整的类型"std::string"
- 与"operator<<"不匹配(操作数类型'std::ostream'
- 错误:类型"std::__1::basic_string<char>"不提供呼叫运算符
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- 错误:移动文件时'QString'为非标量类型"std::__cxx11::字符串"
- CLion 无法解析类型 std::unordered_map,即使它提示我包含标头并且编译工作
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- 返回类型 std::optional<std::variant<...>>
- 变量具有不完整的类型std :: String;string.h有很多错误
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 来自类型为std::basic_string::const_iterator的非常量引用的无效初始化,并且<char>来自类型std::basic_string<char>::
- 类型"std::array<char,6>"和"char"不兼容
- 此错误的含义是什么:从 'char* [40] 转换为非标量类型 'std::string
- 使用 TypedEq() 匹配类型 std::vector<std::vector>
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"