为什么 const 引用可以指向常量还可以取到地址?

2018-09-24 00:09:59 +08:00
 ngg0707
#include <iostream>
using namespace std;

int main(int argc, char const* argv[])
{
    const int& a = 1;
    cout << &a << endl;
    return 0;
}

不知道该怎么搜索这个问题,没查到。有人知道吗?

5599 次点击
所在节点    C
44 条回复
cyspy
2018-09-25 14:56:11 +08:00
虽然不懂 C++,真的没人考虑这是不是 UB 吗。。
ngg0707
2018-09-25 16:41:54 +08:00
@cyspy 但是特么考试考啊
across
2018-09-27 10:25:47 +08:00
more effective C++似乎讲过。临时值生成的那节。

const int& a = 1;属于 ref to const,目标值为常量,允许。
int& a = 1,ref to non-const,目标值可能被修改,不允许。
FrankHB
2018-10-05 11:58:39 +08:00
@xuanbg 初始化一个函数引用,你告诉我这货地址是啥?
@cyspy 不是 UB。
const lvalue reference 用 prvalue 初始化类型兼容,temporary materialization conversion 过了自然就有个对象,但是抽象机语义上有对象和实现是不是给对象分配存储是两回事。就算分配,这种没 ABI 限制的东西不放寄存器里要放主存可以算是没事找事。
至于&的结果还真不一定,因为<<出来的内容是 implementation-defined,编译器完全可以不生成一个对象给你随便一个幺蛾子,只要给文档就行。只不过通常实现都懒得和 iostream 这种破烂有一腿日 builtin 所以看不到而已……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492033

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX