作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的示例中,
#include <iostream>
#include <utility>
//okay:
//
template<typename T, typename F>
decltype(auto) runner(T&& t, F f)
{
return f(std::forward<T>(t));
}
//okay:
//
struct runner_t_f {
template<typename T>
void operator()(T&& t)
{
std::cout<<"template op(): "<<t<<'\n';
}
};
template<typename T>
struct runner_t {
void operator()(T&& t) //error: cannot bind 'T' lvalue to 'T&&'
{
std::cout<<"template functor: "<<t<<'\n';
}
};
int main(void)
{
int j{13};
auto res = runner(j, [](int const& x) -> double { //okay
return static_cast<double>(x*x);
});
std::cout<<res<<'\n';
runner_t_f rtf{};
rtf(j);//okay
runner_t<int> rt{};
rt(j);//not okay...why?
//error: cannot bind ‘int’ lvalue to ‘int&&’
return 0;
}
runner
使用完美转发的蹦床功能。除了
runner_t
之外的所有编译(并执行) ,失败并在上面的代码中注释了错误。为什么?
最佳答案
由于引用折叠和模板类型扣除规则,转发引用工作。
在一个简单的函数中:
template <typename T>
void foo(T&& t) {}
foo(42)
, T
推导出为 int
,等等T&&
变成 int&&
: rvalue-reference-to- int
. int i = 42; foo(i)
, T
推导出为 int&
和 T&&
变成 int& &&
.由于您无法引用引用,因此引用折叠规则开始生效并为您留下 int&
: lvalue-reference-to- int
. template<typename T>
struct runner_t {
void operator()(T&& t) //error: cannot bind 'T' lvalue to 'T&&'
{
std::cout<<"template functor: "<<t<<'\n';
}
};
runner_t<int>
, T&&
变成 int&&
,并且右值引用不能绑定(bind)到 j
因为它是一个左值。 rt
的类型成为 runner_t<int&>
那么 t
的类型将是 int& &&
, 将折叠为 int&
.这可以绑定(bind)到 j
. 关于c++ - 当从仿函数类模板参数推导出(衰减)类型时,完美转发失败。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61282215/
liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问: 为什么我们在高速移动的高铁上网络会变
我正在使用 Kinect 获取每个关节的位置和方向,然后将它们发送到 Unity。我注意到值有很多“跳跃”或波动,例如,有时我不移动我的手,而在 Unity 中它会旋转 180 度。 我想要的是一个平
在下面的示例中, #include #include //okay: // template decltype(auto) runner(T&& t, F f) { return f(st
出于某种原因,即使我设置了衰减因子,我的学习率似乎也没有改变。我添加了一个回调来查看学习率,它似乎在每个纪元之后都是一样的。为什么没有变化 class LearningRatePrinter(Call
考虑下面的代码: #include #include using namespace std; template void Test2(future f, Work w) { async([
我是一名优秀的程序员,十分优秀!