const引用的地址可以不同于被引用对象的地址吗?

Can address of const reference be different than address of referenced object?

本文关键字:地址 引用 对象 const 不同于      更新时间:2023-10-16

我遇到了类似以下代码的问题:

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];
}