为什么这些代码仍然使用 lvalue 函数?
Why these code still use the lvalue function?
这些天我目前正在学习C++左值和右值。我在下面的代码中有点困惑。
class Test {
public:
Test(){}
explicit Test(int _i): i(_i) {}
void doSomething()& {
cout << "L value ref" << endl;
}
void doSomething()&& {
cout << "R value ref" << endl;
}
private:
int i;
};
void callDoSomething(Test& t) {
t.doSomething();
}
void callDoSomething(Test&& t) {
t.doSomething();
}
int main() {
auto a = Test();
callDoSomething(a);
callDoSomething(Test());
return 0;
}
在上面的代码中,我将得到以下结果:
L value ref
L value ref
我已经通过调试器检查了上面的代码,并且非常确定在此代码片段中:callDoSomething(Test());
它将转到callDoSomething(Test&& t)
的右值引用。但是为什么它仍然调用左值成员函数呢?
我也尝试了模板,但仍然得到相同的结果。
template <typename T>
void callDoSomething(T &&t) {
t.doSomething();
}
我已经阅读了这篇文章,并且在模板版本中知道这一点。T &&t
实际上是一个通用参考。但是通过调试器检查后。t
的类型仍然Test&&
,我们可以得到Test&& &&t
.通过引用折叠的定义,我们仍然应该得到Test&& t
。
谁能解释为什么会这样?多谢!
当你有一个带有名称的变量时,它是一个左值。 这意味着doAThing(X&& t)
接受一个右值的参数;但在函数中,它是一个称为 T 的左值。
如果你要做std::move(t).doAThing()
你最终会再次得到一个右值调用。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 为什么这些代码仍然使用 lvalue 函数?
- 与构造函数中rvalue结合的非const lvalue有关的错误
- C++:在没有 lvalue 的情况下调用时复制构造函数不起作用
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- C++ 方法调用 (lvalue) 绑定到派生类中的函数 (rvalue),而不是基类中的函数 (lvalue)
- 如何在用std ::前进的构造函数中制作const lvalue
- C ,为什么可以将RVALUE传递到将lVALUE参考作为参数的函数
- 无法在函数main中编译,需要Lvalue