非平凡的右值和左值示例

non-trivial rvalue and lvalue example

我不确定一些 rvalue/lvalue 重要的例子。

std::vector<int>({1,2,3})[0]std::vector<int>()表达式是左值还是右值?

该代码没有实际用途,但让我有点惊讶的是该代码是有效的。看起来它们都是左值。还是不?

#include <vector>

int main()
{
    std::vector<int>({1,2,3})[0] = 0;
    std::vector<int>() = {1,2,3}; 
    return 0;
}

更多示例...

下面的std::vector<int>()表达式是一个右值。正确的? 以及表达式 std::vector<int>({1,2,3})[0]?
来自 std::vector<int>() 的矢量对象和来自 ...[0] 的 int 值都是临时值。对吗?

auto v = std::vector<int>();
int i = std::vector<int>({1,2,3})[0];

std::vector<int>() 是一个右值,因为语法 type() 总是产生一个右值。 std::vector<int>() = {1,2,3}; 是允许的,因为通常允许分配给 class 类型的右值,但可以通过使用 & qualifier 定义 operator= 来禁用特定的 class, std::vector 不行。

std::vector<int>({1,2,3})[0] 是一个左值,因为 std::vector<...>::operator[] 被定义为 return 一个左值引用。可以将其定义为 return 右值或左值,具体取决于它是在右值还是左值上调用的向量(参见上面的 link),但 std::vector 不会那样做。

Both the vector object from std::vector() and the int value from ...[0] are temporary values. right?

vector - 是的。 int - 不,至少是正式的。

对象是否是临时对象完全取决于它的创建方式,例如type()总会给你一个临时的。

向量在堆上分配其元素,这会产生正常的 non-temporary 对象。向量本身是临时的并不重要。