gpt4 book ai didi

c++ - 将数据移入函数然后返回到它的来源时是否存在任何未定义的行为问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:37 25 4
gpt4 key购买 nike

考虑以下函数:

std::vector<int> pushIt(std::vector<int> v){
v.push_back(10);
return v;
}

int main(){
std::vector<int> vec;
vec = pushIt(std::move(vec));
}

我的假设是 vector 被移入函数,修改并移回其原始位置。这应该导致与将其作为非 const 引用传递时类似的行为。这似乎是非常有效的行为,但一位同事担心未定义的行为。我在这里缺少什么吗?

我想这样做是因为当前的功能

void currentPushIt(std::vector<int>& v){
v.push_back(10);
}

在代码审查中导致了很多问题,因为人们忽略了一个事实,即对 currentPushIt(v) 的无辜调用可能会使迭代器无效。让他们编写 v=pushIt(std::move(v)) 应该足以唤醒他们,使他们不会犯同样的错误。

最佳答案

根据 1.9p15,与参数相关的值计算和副作用在函数体执行之前排序。所以当你输入 pushIt 时,源代码 vec 已经被移走了。然后在执行 pushIt 之后对分配进行排序,因为您实际上是在调用用户定义的运算符 vector::operator=:

vec.operator=(       // sequenced after
pushIt( // the evaluation of this, which is sequenced after
std::move( // the evaluation of this
vec)))

所以你的代码没问题。

关于c++ - 将数据移入函数然后返回到它的来源时是否存在任何未定义的行为问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22539850/

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