gpt4 book ai didi

c++ - 如果将匿名对象传递给采用引用的函数,在 C++ 中会发生什么情况?

转载 作者:太空狗 更新时间:2023-10-29 19:37:39 24 4
gpt4 key购买 nike

IE 如果你有下面这段代码会发生什么?

int mean(const vector<int> & data) {
int res = 0;
for(size_t i = 0; i< data.size(); i++) {
res += data[i];
}
return res/data.size();
}

vector<int> makeRandomData() {
vector<int> stuff;
int numInts = rand()%100;
for(int i = 0; i< numInts; i++) {
stuff.push_back(rand()%100);
}
}

void someRandomFunction() {
int results = mean(makeRandomData());
}

我认为 C++ 只会在平均生命周期内保留新创建的对象,然后因为它超出范围而销毁它,我的想法是否正确?

此外,这如何与 RVO 一起工作/干扰?

提前致谢。

已编辑:添加了常量,忘了把它放进去。

最佳答案

我的灵能告诉我,您是在 Visual C++ 上编译它,这就是它甚至可以工作的原因。在标准 C++ 中,您不能将右值(即 makeRandomData 的返回值)传递给非常量引用,因此这个问题没有实际意义。

但是,如果您更改mean的签名,问题仍然有效。采取const vector<int>& .在这种情况下,这一切都归结为临时的生命周期——它被定义为持续到它出现的“完整表达式”结束。在您的特定情况下,完整表达式是 results 的整个初始化程序.如果是表达式语句,完整的表达式就是整个语句。

标准没有指定函数参数可以抑制 RVO 的任何方式,但是,当然,RVO 是编译器强制执行特定优化而不考虑可见的副作用,而不是要求 去做。何时(以及是否)发生 RVO 完全取决于您使用的特定编译器。也就是说,似乎没有任何理由说明它应该以任何方式受到影响。

关于c++ - 如果将匿名对象传递给采用引用的函数,在 C++ 中会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622601/

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