const引用的地址可以不同于被引用对象的地址吗?
Can address of const reference be different than address of referenced object?
我遇到了类似以下代码的问题:
const auto &const_reference = some_object;
assert(&const_reference == &some_object);
当我用g++ -O3标志编译它时,它不会通过断言。如果编译时没有进行优化,则传递断言。
据我所知,即使我的项目中有UBs,这种情况也不应该发生。
在任何情况下,这种引用行为是预期的吗?
编辑:链接到实际代码:https://github.com/Gray0Ed/ggp_thesis/blob/67606021020546b315ad63b7fd5c2203f3e0086f/rule_engine/aligner.cpp#L177 -项目有点混乱,它还没有真正准备好公开展示,但如果你好奇,可以随意查看。
EDIT2:正如RustyX指出的那样,原始代码与我上面给出的"等效"不同,请查看他的回答以查看详细信息。
这段代码总是有效的:
const auto &const_reference = some_object;
assert(&const_reference == &some_object);
实际不起作用的代码实际上是这样的:
const auto &oc = ai->var_infos[var_id].occurences[0];
assert(&oc == &ai->var_infos[var_id].occurences[0]);
它不能工作,因为你重载了operator[]
:
看到MyArrays.hpp:
T operator[](size_t i) const {
assert(size >= 0);
assert(i < size && i >= 0);
return items[i];
}
每次调用时返回一个副本。
应该是:
const T& operator[](size_t i) const {
assert(size >= 0);
assert(i < size && i >= 0);
return items[i];
}
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 右值引用转换后的地址更改
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 获取通用/前向引用地址有什么意义?
- 按引用传递和按地址传递之间的差异
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 常量引用函数参数的地址何时唯一?
- 通过引用传递是否涉及复制地址
- 总是引用的地址等于源地址
- 在函数中传递变量的指针和引用/地址
- 为什么取消引用的指针指向指针的 std::cout 会导致 -fsanitize=地址投诉?
- 如何通过引用获取引用变量的地址?
- 取消引用地址时是否可以重定向到其他地址?
- 在 C++ 03 中,如何引用一个被煽动的模板函数的地址
- 取消引用的输入迭代器的地址?istream_iterator的情况
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 变量循环范围会导致返回局部变量的地址引用
- 使用cout,如何将char转换为变量的地址/引用(?)
- 为什么函数不能更改其参数对象的地址/引用值?