C++ 如何编写转发函数模板?
我想进一步了解C++ 如何编写转发函数模板?,c++,perfect-forwarding,C++,Perfect Forwarding,我想进一步了解std::forward如何工作,以及显式模板参数和模板参数推断如何与转发引用一起工作,我尝试了以下示例: template <typename T> T&& fwd_(typename std::remove_reference<T>::type& arg){ std::cout << "fwd_(type&)\n"; return static_cast<T&&
std::forward
如何工作,以及显式模板参数和模板参数推断如何与转发引用一起工作,我尝试了以下示例:
template <typename T>
T&& fwd_(typename std::remove_reference<T>::type& arg){
std::cout << "fwd_(type&)\n";
return static_cast<T&&>(arg);
}
template <typename T>
T&& fwd_(typename std::remove_reference<T>::type&& arg){
std::cout << "fwd_(type&&)\n";
++arg;
return static_cast<T&&>(arg);
}
int main(){
int&& l = fwd_<int>(5);
int&& m = fwd_<int&&>(7);
int& j = fwd_<int&>(m);
int& k = fwd_<int&>(7); // UB?
std::cout << k << std::endl;
std::cout << '\n';
}
模板
T&fwd(类型名称std::删除\引用::类型和参数){
标准::cout
我不知道k发生了什么事?我怎么能把r值作为l值传递呢?(fwd_7))
是的,这是危险的,因为T
是int&
并且返回值T&&
,这是我们得到int&&
→ int&
,即返回对临时变量的引用,该变量没有延长使用寿命,因此在完整表达式末尾销毁临时变量后会导致UB(;
)
为此,C++标准明确地从“代码> STD::前进/<代码>:
使用此用法
模板constepr T&forward(删除引用)无例外;
template constepr T&&forward(删除引用)无例外;
3备注:如果第二个表单用左值实例化
引用类型,程序格式不正确。
例如,在这种情况下,libstdc++有一个早期故障:
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
{
static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
" substituting _Tp is an lvalue reference type");
return static_cast<_Tp&&>(__t);
}
模板
constexpr\u Tp&&
转发(typename std::remove_reference::type&&__t)无例外
{
静态断言(!std::is\u左值\u引用::值,“模板参数”
“替换_Tp是左值引用类型”);
返回静态\u cast(\uu t);
}