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

时间:2016-09-06 10:14:41

标签: c++ g++

我遇到的问题与以下代码相同:

const auto &const_reference = some_object;
assert(&const_reference == &some_object);

当我使用g ++ -O3标志编译它时,它不会通过断言。如果在没有优化的情况下进行编译,则会传递断言。

据我所知,即使我的项目中有UB,也不应该出现这种情况。

是否存在预期此类行为参与的情况?

编辑: 链接到实际代码:https://github.com/Gray0Ed/ggp_thesis/blob/67606021020546b315ad63b7fd5c2203f3e0086f/rule_engine/aligner.cpp#L177 - 项目有点乱,并没有真正准备好公开展示,但如果你很好奇,可以随意查看。

EDIT2: 正如RustyX指出原始代码与我上面给出的“等效”不同,请查看他的答案以查看详细信息。

1 个答案:

答案 0 :(得分:4)

此代码将始终有效:

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