为什么 rval ref 绑定到 lval ref 函数
Why is rval ref binding to lval ref function?
在下面的代码中,is_rvalue_reference
返回true。我希望testRef(int &&)
被调用而不是testRef(int &)
,但事实并非如此(至少使用我的Visual Studio 2015编译器(。
知道为什么吗?
void testRef( int&& i )
{
cout << "called testRef(int&&) " << endl;
}
void testRef( int& i )
{
cout << "called testRef(int&) " << endl;
}
int main()
{
int && rvalref = 4;
cout << "is rval? : " << std::is_rvalue_reference<decltype( rvalref )>() << endl;
testRef( rvalref );
}
请注意,这与右值引用被视为左值?
在那篇文章中,他们谈论的是函数中的变量:这就像问在我的示例中变量 i 是右值还是左值(答案是它在两种情况下都是左值,因为它在两种情况下都有一个地址(。
拥有右值和std::move
的全部意义在于,这是一个强制转换为右值,是允许在函数和构造函数中选择正确的重载。例如,以下两种情况都解析为对testRef(int && i)
的调用:
int main()
{
int g = 3;
testRef(std::move(g));
testRef(4);
}
但是对于右值引用,情况似乎并非如此。
rvalref
是对象的标识符。 对象的标识符始终为左值。
表达式从不具有引用类型。表达式rvalref
具有类型 int
和值类别"左值"。
在声明int && rvalref
中,&&
描述了如何初始化rvalref
(即通过向由另一个表达式表示的对象添加新名称,而不是创建新对象(,仅此而已。
在表达式中,对象名称的行为是相同的,无论该名称是否是该对象的第一个名称。
与decltype(general_expression)
相比,代码decltype(identifier)
具有特殊行为。它不提供由该标识符组成的表达式的类型和值类别。代码decltype((identifier))
会这样做。延伸阅读
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 将Ref对象作为类成员
- 为什么我的 std::ref 无法按预期工作?
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何@ref同一方法的不同变体?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 为什么要用 ref-qualifier 和
- 将 ArrayXd 传递给 const VectorXd& 和 const Ref<const VectorXd>&
- 返回 Eigen::Ref 合法吗?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 在与Odint组合的类中使用特征矩阵Ref
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- 正在通过const-ref未定义的行为捕获新构造的对象
- C++将包含的库 (ref DLL) 从根目录更改为另一个位置
- 无法修改其他线程中 ref 传递的值
- 为什么 rval ref 绑定到 lval ref 函数