C++ 带C+的左值和右值+;阵列
我在阵列上做了一些实验,学习了L值和R值 据我了解: L值是具有可识别内存位置的对象,R值是通过排除定义的,任何不是L值的东西都是通过排除定义的R值 这是我的实验:C++ 带C+的左值和右值+;阵列,c++,arrays,C++,Arrays,我在阵列上做了一些实验,学习了L值和R值 据我了解: L值是具有可识别内存位置的对象,R值是通过排除定义的,任何不是L值的东西都是通过排除定义的R值 这是我的实验: int array [] = {8, 7, 6, 5, 4}; std::cout << array << std::endl; //0x61fedc std::cout << &array << std::endl;
int array [] = {8, 7, 6, 5, 4};
std::cout << array << std::endl; //0x61fedc
std::cout << &array << std::endl; //0x61fedc
std::cout << *(&array) << std::endl; //0x61fedc
std::cout << *array << std::endl; //8
int数组[]={8,7,6,5,4};
你的问题已经有答案了。基本上,有时会发生数组到指针的转换,有时不会
您对左值的定义不正确。左值必须能够分配给;它在作业的左侧有效。例如,只读位置有地址,但不是左值。我发现一个示例可以说明这一点。这里我有一些foo
重载,它们接受您在代码中使用的版本
#include <iostream>
#include <string>
template<size_t N>
std::string foo(const int(&)[N]) {
return std::string(" int(&)[") + std::to_string(N) + "]\n";
}
template<size_t N>
std::string foo(const int(*)[N]) {
return std::string(" int(*)[") + std::to_string(N) + "]\n";
}
std::string foo(const int*) {
return " int*\n";
}
std::string foo(int) {
return " int\n";
}
int main() {
int array [] = {8, 7, 6, 5, 4};
std::cout << array << foo(array);
std::cout << &array << foo(&array);
std::cout << *(&array) << foo(*(&array));
std::cout << *array << foo(*array);
}
如您所见,通过这种重载组合,所有版本都不会衰减为int*
只读位置可以是左值<代码>常量int值=5
和“abc”
都是只读和左值(更不用说只读左值引用const T&
)。并且可以将R值分配给:std::string(“aaa”)=“bbb”代码>很好用。@Artyer:你必须支持它。在我的书架上,用5分钟的时间,连同《龙之书》(p64/65/etc)和《米切尔》(p118),清楚地表明你必须能够以左值存储某些东西。初始化不是一回事。我还编写了2个编译器。从C++(17)标准6.10 [Basic。LVAL]中得出:“GLUVE是一个表达式,其评估决定对象、位字段或函数的身份。”(基本上有一个地址)。在另一条注释中的示例中,value
是只读左值,“abc”
是静态存储持续时间的标识const char[4]
(标准中的8.1.1[expr.prim.literal]明确表示:“字符串文字是左值”)。另外,std::string(“aaa”)
是一个右值,因为在通过临时物质化创建之前,没有对象可以作为它的标识,但它可以指定给。此外,标准状态下,每个表达式都必须是左值、X值或PR值。计算结果为只读位置地址的表达式必须是左值或xvalue(glvalue),否则就没有地址。
0x7ffeaf43a610 int(&)[5]
0x7ffeaf43a610 int(*)[5]
0x7ffeaf43a610 int(&)[5]
8 int