- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我发布了这个答案:https://stackoverflow.com/a/28459180/2642059其中包含以下代码:
void foo(string&& bar){
string* temp = &bar;
cout << *temp << " @:" << temp << endl;
}
bar
是右值还是左值?
我问是因为我显然不能获取右值的地址,但我可以像这里所做的那样获取右值引用的地址。
如果您可以对右值引用执行您可以对左值引用执行的任何操作,那么使用“&&”而不是仅仅使用“&”来区分两者有什么意义?
最佳答案
Is
bar
an rvalue or an lvalue?
问题自己回答。任何有名字的都是左值(1)。所以 bar
是一个左值。它的类型是“string
的右值引用”,但它是该类型的左值。
如果您想将其视为右值,则需要对其应用 std::move()
。
If you can perform any operation on an rvalue reference that you can on an lvalue reference what is the point in differentiating between the two with the "&&" instead of just an "&"?
这取决于您对“执行操作”的定义。左值引用和(命名的)右值引用在如何在表达式中使用它们方面几乎相同,但它们在可以绑定(bind)到它们的内容上很多。左值可以绑定(bind)到左值引用,右值可以绑定(bind)到右值引用(任何东西都可以绑定(bind)到 const
的左值引用)。也就是说,您不能将右值绑定(bind)到左值引用,反之亦然。
我们来谈谈右值引用类型的函数参数(比如你的bar
)。重要的一点不是 bar
是什么,而是您对 bar
引用的值了解多少。由于 bar
是一个右值引用,您可以肯定地知道绑定(bind)到它的任何东西 都是一个右值。 这意味着它一定会在完整表达式结束时被销毁,并且您可以安全地将其视为右值(通过窃取其资源等)。
如果您不是直接对 bar
执行此操作的人,而只是想传递 bar
,您有两个选择:要么完成 bar
,然后你应该告诉下一个接收它的人它绑定(bind)到一个右值——执行 std::move(bar)
。或者你需要用 bar
做更多的事情,所以你不希望中间的任何人从你下面窃取它的资源,所以把它当作一个左值——bar
.
总结一下:区别不在于您拥有引用后可以对其执行的操作。区别在于可以绑定(bind)到引用的内容.
(1) 一个很好的经验法则,但有一些小异常(exception):枚举数有名称,但是是右值。类、命名空间和类模板有名称,但没有值。
关于c++ - 右值引用被视为左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52142104/
我是 C++ 的新手,正在尝试编写如下接口(interface): template class Comparable { protected: Comparable(){};
什么是左值? 最佳答案 左值是可以分配给以下值的值: lvalue = rvalue; 它是“left value”或“lefthand value”的缩写,它基本上只是=符号左侧的值,即您为其分配值
这个问题已经有答案了: Why do C and C++ support memberwise assignment of arrays within structs, but not general
C++03 $14.1/6 - "A non-type non-reference template-parameter is not an lvalue." C++0x $14.2/6- "A no
这只是出于好奇我问... 我在任何地方看到的 99% 的代码,当使用“IF”时,将采用“If (RValue == LValue) ...”格式。例子: If (variableABC == "Hel
在 C++03 中,表达式可以是右值,也可以是左值。 在 C++11 中,表达式可以是: 右值 左值 x值 gl值 右值 两个类别变成了五个类别。 这些新的表达类别是什么? 这些新类别与现有的右值和左
我正在尝试将 div 向左移动指定数量的像素,我正在使用从此处获得的 slider : http://carpe.ambiprospect.com/slider/archive/v1.3/ 所以从示例
所以我有一个函数需要将 std::vector 作为参数。我想知道声明参数的最佳方式,这样底层数组就不会被深度复制,因为它可能相当大。 // which should I choose? void m
在 C++03 中,表达式要么是右值,要么是左值。 在 C++11 中,表达式可以是: 右值 左值 xvalue glvalue 右值 两类变成了五类。 这些新的表达类别是什么? 这些新类别与现有的右
我正在尝试实现类似 find 的方法来从容器中提取对值的引用,如果找不到该值或该值的类型不兼容,则返回一个默认值。 template const T& get (key_type k, const T
我有以下代码: #include using namespace std; void test(int& a) { cout << "lvalue." << endl; } void tes
我的搜索发现许多关于右值绑定(bind)到左值的帖子,但没有任何类似的帖子。对不起,如果它是重复的。 struct StrHolder { StrHolder(std::string&& s)
这是一个后续问题 C++0x rvalue references and temporaries 在上一个问题中,我问过这段代码应该如何工作: void f(const std::string &);
为什么这不起作用: ostream& operator' lvalue to 'std::basic_ostream&&'| error: initializing argument 1 of '
偶尔,我被问到一个技巧问题:x++ 和 ++x 哪个不能在 c 中留值?很多人告诉我++x不能,因为++x的汇编代码不返回寄存器。我对此表示怀疑。所以我做了一些实验。 C 代码: #include
所以这个问题与我为实际问题选择的解决方案有关,为了尽可能提供完整的图片,这个问题是这样的:基本上我有一个带有很多模板参数的函数,我正在尝试暴露给 Python。与用宏做一些噩梦般的事情来消除我需要的所
指针很简单。有一些内存保存着一个地址。要获得(有意义的)值,取消引用返回地址指向的内存中包含的值。 引用以某种方式做一些类似的事情:它们持有指向一个临时对象的“链接”。但是当我分配或使用引用时会发生什
下面是一些示例代码: #include class Foo { public: explicit Foo(int x) : data(x) {}; Foo& operator++() {
背景 以下代码块出现在 Scott Meyers 的名著 "Effective C++" 中第 3 项: class TextBlock { public: ... const cha
我是一名优秀的程序员,十分优秀!