非平凡的右值和左值示例

问题描述

我不确定一些右值/左值非临时性示例。

在左值或右值下方的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总是会给您一个临时的机会。

向量在堆上分配其元素,这将导致正常的非临时对象。向量本身是临时的都没关系。