0

我不确定一些右值/左值非平凡的例子。

和表达式低于左值还是右值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]
向量对象 fromstd::vector<int>()和 int 值 from...[0]都是临时值。正确的?

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

1 回答 1

0

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

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

来自 std::vector() 的向量对象和来自 ...[0] 的 int 值 是临时值。正确的?

vector- 是的。-int不,至少在形式上是这样。

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

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

于 2020-10-31T13:18:43.693 回答