我遇到了与以下代码等效的问题:
const auto &const_reference = some_object;
assert(&const_reference == &some_object);
Run Code Online (Sandbox Code Playgroud)
当我使用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);
Run Code Online (Sandbox Code Playgroud)
不起作用的实际代码实际上是这样的:
const auto &oc = ai->var_infos[var_id].occurences[0];
assert(&oc == &ai->var_infos[var_id].occurences[0]);
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为你超载了operator[]:
参见 MyArrays.hpp:
T operator[](size_t i) const {
assert(size >= 0);
assert(i < size && i >= 0);
return items[i];
}
Run Code Online (Sandbox Code Playgroud)
每次调用时都会返回一个副本。
大概应该是:
const T& operator[](size_t i) const {
assert(size >= 0);
assert(i < size && i >= 0);
return items[i];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |