gpt4 book ai didi

c++ - 引用折叠规则未按预期应用?

转载 作者:行者123 更新时间:2023-12-03 07:15:35 25 4
gpt4 key购买 nike

我正在刷新我对 C++ 中完美转发如何工作的内存。我意识到调用 std::forward出于某种原因(即在处理实际上是左值的右值引用时)被迫提供显式模板参数,但是在对实际代码进行完整性检查时,我对这个(有点相关的)场景感到惊讶:

#include <iostream>
#include <utility>
#include <type_traits>

template<class T>
T&& fwd(T& t) {
return static_cast<T&&>(t);
}

template<class T>
T&& fwd(T&& t) {
return static_cast<T&&>(t);
}

int main()
{
int lnum = 3;
if (std::is_rvalue_reference<decltype(fwd(lnum))>::value)
std::cout << "It's rref." << std::endl; // this get's printed on screen
else
std::cout << "It's lref." << std::endl;

return 0;
}
如果我理解引用折叠正确(我相信我理解),类型推导应该是这样的:
int& && fwd(int& & t) {                        
return static_cast<int& &&>(t);
}
导致
int& fwd(int& t) {                        
return static_cast<int&>(t);
}
显然情况并非如此。我在这里想念什么?

最佳答案

实际上,不会发生引用折叠。需要注意的相关功能模板,即选择的那个,是:

template<class T>
T&& fwd(T& t) { // <-- not a forwarding reference
return static_cast<T&&>(t);
}
注意这个函数模板有 没有转发引用——函数参数, t , 只是一个左值引用( T& t )。 T模板参数推导出为 int – 不是 int& – 因为 t不是转发引用,而只是左值引用。如果你只是替换 T通过 int在上面的函数模板中,您将获得:
template<class T>
int&& fwd(int& t) {
return static_cast<int&&>(t);
}
没有应用引用折叠,因为这里没有这样的东西最终会成为对引用的引用(例如, int& &&int&& &&)。

关于c++ - 引用折叠规则未按预期应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64574214/

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