首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左值到右值引用绑定

左值到右值引用绑定
EN

Stack Overflow用户
提问于 2013-12-14 20:52:38
回答 1查看 26.2K关注 0票数 27

编译器一直抱怨我试图将一个左值绑定到一个右值引用,但我看不出该如何绑定。我对C++11、移动语义等都是新手,所以请耐心等待。

我有这个函数:

代码语言:javascript
复制
template <typename Key, typename Value, typename HashFunction, typename Equals>
Value& FastHash<Key, Value, HashFunction, Equals>::operator[](Key&& key)
{
    //  Some code here...

    Insert(key, Value()); // Compiler error here

    //   More code here.
}

它调用此方法:

代码语言:javascript
复制
template <typename Key, typename Value, typename HashFunction, typename Equals>
void FastHash<Key, Value, HashFunction, Equals>::Insert(Key&& key, Value&& value)
{
    // ...
}

我一直收到类似以下的错误:

代码语言:javascript
复制
cannot convert argument 1 from 'std::string' to 'std::string &&'

在Insert()调用中。key不是在操作符重载中定义为右值吗?为什么它被重新解释为左值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-14 20:56:19

代码语言:javascript
复制
Insert(key, Value()); // Compiler error here

这里的keyKey&& key -这是一个左值!它有一个名字,你可以取它的地址。只是左值类型是“对Key的右值引用”。

您需要传入一个右值,为此您需要使用std::move

代码语言:javascript
复制
Insert(std::move(key), Value()); // No compiler error any more

我明白为什么这是违反直觉的了!但是,一旦区分了和rvalue引用(绑定到rvalue的引用)和实际的rvalue,它就会变得更加清晰。

编辑:这里真正的问题是使用右值引用。在推断参数类型的函数模板中使用它们是有意义的,因为由于引用折叠规则,这允许参数绑定到左值引用或右值引用。请参阅本文和视频了解原因:http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers

但是,在这种情况下,调用函数时不会推导出键的类型,因为在实例化FastHash<std::string, ... >时,类已经确定了键的类型。因此,您实际上是在规定使用右值引用,因此使用std::move修复了代码。

我会将您的代码更改为按值获取参数:

代码语言:javascript
复制
template <typename Key, typename Value, typename HashFunction, typename Equals>
Value& FastHash<Key, Value, HashFunction, Equals>::operator[](Key key)
{
    //  Some code here...

    Insert(std::move(key), Value());

    //   More code here.
}

template <typename Key, typename Value, typename HashFunction, typename Equals>
void FastHash<Key, Value, HashFunction, Equals>::Insert(Key key, Value value)
{
    // ...
}

不要担心由于使用了值参数而产生的额外副本-这些副本通常会被编译器优化掉。

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

https://stackoverflow.com/questions/20583531

复制
相关文章

相似问题

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