Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带C+的左值和右值+;阵列_C++_Arrays - Fatal编程技术网

C++ 带C+的左值和右值+;阵列

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;

我在阵列上做了一些实验,学习了L值和R值

据我了解:

L值是具有可识别内存位置的对象,R值是通过排除定义的,任何不是L值的东西都是通过排除定义的R值

这是我的实验:

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