非平凡的右值和左值示例
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 对象。向量本身是临时的并不重要。
我不确定一些 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 对象。向量本身是临时的并不重要。