gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:55 25 4
gpt4 key购买 nike

我遇到了等同于以下代码的问题:

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 - 项目有点乱,还没有真正准备好公开展示,但如果你好奇的话,可以随意看看。

编辑2:由于 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++ - const 引用的地址可以与引用对象的地址不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39346442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com