问题描述
考虑以下代码:
${NodeID}
以上是格式良好的代码还是UB?
我怀疑 ${EventID}
返回的引用在最后一个分号处悬空。但此时 #include <vector>
struct temp {
int& get() { return i; }
int i = 1;
};
int main() {
std::vector<int> v;
v.push_back(temp{}.get());
}
已经被求值,所以没问题,不是吗?
解决方法
临时变量一直存在到完整表达式的末尾。在这种情况下,这意味着在 push_pack
返回之后。由于 push_back
复制了 get
所引用的值,因此没有悬空引用,一切都会按预期工作。