繁体   English   中英

左值和右值与 C++ 数组

[英]Lvalue and Rvalue with 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;          //0x61fedc
std::cout << *(&array) << std::endl;       //0x61fedc
std::cout << *array << std::endl;          //8

第 1 行和第 2 行应该毫无意外,当您评估数组时,它将返回第一个元素的地址

令人困惑的是第 3 行的结果。 *(&array)对我说“变量array的第一个内存地址的取消引用值是多少,我期待8 ,但是我得到了第一个内存地址,这是为什么?

最后,第 4 行计算结果为8 ,这是预期的。 然而,既然解引用操作符作用于array变量,为什么我们不能断定array是一个指针(指向第一个元素的内存地址)呢? 我知道这不可能是事实,但他们的行为是一样的?

谢谢

我发现一个例子澄清。 在这里,我有一些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);
}

可能的输出:

0x7ffeaf43a610 int(&)[5]
0x7ffeaf43a610 int(*)[5]
0x7ffeaf43a610 int(&)[5]
8 int

如您所见,通过这种重载组合,没有一个版本会衰减为int*

您的问题在这里已经有了答案。 基本上,有时会发生数组到指针的转换,有时则不会。

您对左值的定义不正确。 左值必须能够被赋值; 它在作业的左侧有效。 例如,只读位置具有地址,但不是左值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM