如果您有以下代码,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/