来自Brian W. Kernighan的C编程语言
&运算符仅适用于内存中的对象:变量和数组元素.它不能应用于表达式,常量或寄存器变量.
如果不在内存中,表达式和常量存储在哪里?这句话是什么意思?
例如:
&(2 + 3)
为什么我们不能拿它的地址?它存放在哪里?
对于C++,答案是否也一样,因为C一直是它的父级?
这个链接的问题解释了这样的表达式是rvalue对象,并且所有rvalue对象都没有地址.
我的问题是这些表达式存储在哪里,以至于无法检索到它们的地址?
过去几年我一直用C++编写代码.但有一个问题我无法弄清楚.我想问一下,C++,rvalues都是临时工吗?
如果不是,任何人都可以提供一个例子,其中代码中的临时生成是左值?
根据" 如何绕过警告"rvalue用作左值"? ",Visual Studio只会警告代码如下:
int bar() {
return 3;
}
void foo(int* ptr) {
}
int main() {
foo(&bar());
}
Run Code Online (Sandbox Code Playgroud)
在C++中,不允许获取临时(或者至少是由rvalue表达式引用的对象?)的地址,我认为这是因为临时保证甚至不能保存.
但是,虽然诊断程序可能以编译器选择的任何形式呈现,但我仍然期望MSVS 出错而不是在这种情况下发出警告.
那么,临时保证有储存吗?如果是这样,为什么上面的代码首先被禁止?
我使用了以下语法糖:
for (auto& numberString: {"one", "two", "three", "four"}) { /* ... */}
Run Code Online (Sandbox Code Playgroud)
这是有效的代码吗?AFAIK,基于这个问题,这应该是非法的,但代码按预期运行。我认为我对此事的理解不正确。
据我所知,只有文字不应该有内存地址,但链接的问题正在讨论临时值和右值。