[英]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.