首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么rval ref绑定到lval ref函数?

为什么rval ref绑定到lval ref函数?
EN

Stack Overflow用户
提问于 2017-02-04 12:44:13
回答 1查看 630关注 0票数 1

在下面的代码中,is_rvalue_reference返回true。我希望testRef(int &&)被调用,而不是testRef(int &),但事实并非如此(至少我的Visual 2015编译器是这样的)。

知道原因了吗?

代码语言:javascript
复制
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 );
}

请注意,这与Rvalue Reference is Treated as an Lvalue?中的问题不同

在那篇文章中,他们讨论的是函数内部的变量:这就像在我的示例中询问变量i是rvalue还是lvalue (答案是在这两种情况下都是lvalue,因为在这两种情况下它都有一个地址)。

拥有rvalue和std::move (这是对rvalue的强制转换)的全部意义是允许在函数和构造函数中选择正确的重载。例如,以下两种情况都解决了对testRef(int && i)的调用

代码语言:javascript
复制
int main()
{
  int g = 3;
  testRef(std::move(g));
  testRef(4);
}

但就参考价值而言,情况似乎并非如此。

EN

回答 1

Stack Overflow用户

发布于 2017-02-05 03:12:59

rvalref是对象的标识符。对象的标识符始终是lvalue。

表达式从来没有引用类型。表达式rvalref有类型int和值类别"lvalue“。

在声明int && rvalref中,&&描述了如何初始化rvalref (即向另一个表达式表示的对象添加一个新名称,而不是创建一个新对象),仅此而已。

在表达式中,无论名称是否为对象的第一个名称,对象名称的行为都是相同的。

decltype(identifier)相比,代码decltype(general_expression)具有特殊的行为。它不给出由该标识符组成的表达式的类型和值类别。代码decltype((identifier))就能做到这一点。Further reading

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42040513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档