问题描述
我不确定一些右值/左值非临时性示例。
在左值或右值下方的std::vector<int>({1,2,3})[0]
和std::vector<int>()
表达式是什么?
该代码没有实际用法,但令我惊讶的是该代码有效。看起来它们都是左值。还是不?
#include <vector>
int main()
{
std::vector<int>({1,3})[0] = 0;
std::vector<int>() = {1,3};
return 0;
}
更多示例...
下面的std::vector<int>()
表达式是一个右值。对?
以及表达式std::vector<int>({1,3})[0]
呢?
来自std::vector<int>()
的向量对象和来自...[0]
的int值都是临时值。对吧?
auto v = std::vector<int>();
int i = std::vector<int>({1,3})[0];
解决方法
%>%
是一个右值,因为语法std::vector<int>()
总是产生一个右值。允许使用type()
是因为通常允许分配给类类型的右值,但是可以通过使用&
qualifier定义std::vector<int>() = {1,2,3};
来禁止特定类的使用,operator=
不能这样做。做。
std::vector
是左值,因为std::vector<...>::operator[]
被定义为返回左值引用。可以根据返回值是左值还是左值来定义它返回右值或左值(请参见上面的链接),但是std::vector<int>({1,3})[0]
不会这样做。
来自std :: vector()的矢量对象和来自... [0]的int值是临时值。对吧?
std::vector
-是的。 vector
-不,至少是正式的。
某个对象是否为临时对象仅取决于其创建方式,例如int
总是会给您一个临时的机会。
向量在堆上分配其元素,这将导致正常的非临时对象。向量本身是临时的都没关系。