gpt4 book ai didi

c++ - 将临时对象作为参数传递 (C++)

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:53 25 4
gpt4 key购买 nike

有时在 C++ 中创建临时对象。 STL valarray 类的一个示例是 slice_array,每次选择 valarray 的一系列索引时都会调用它。 http://www.cplusplus.com/reference/valarray/slice_array/

我的问题是:

将这些临时对象作为参数传递给函数时,传递的是这些对象的拷贝,还是仅传递引用?

例如想象一下这两个简单的函数:

double simple_product(double* inp,int length){
double res=1;
for(int i=0;i<length;++i){
res = res*inp[i];
}
return(res);
}

double sum_selected(valarray<double> v){

simple_product(&v[0],v.size());
return(v.sum());
}

如果我按以下方式调用它们:

valarray<double> valery(10,10);
size_t sel[] = {1,3,4};
valarray<size_t> selection (sel,3);
cout << sum_selected(valery[selection]);

是否会在sum_selected函数的栈中临时创建一个大小为3*size_t的新对象?

请注意将函数声明为:double sum_selected(valarray<double> & v)不允许(临时对象只能绑定(bind)到 const 引用)。

这很有趣的原因是,例如在这里,不可能将函数声明为:

double sum_selected(const valarray<double> & v) ,因为这样就无法调用函数 simple_product(假设它是不可更改的)。但是,在大数组的情况下,对传递的参数进行临时复制会对内存造成问题。

最佳答案

如果函数被声明为按值获取其参数,则它按值传递,创建对象的新拷贝:

void f(thing t);           // pass by value

如果它被声明为通过引用获取它的参数,那么它就是通过引用传递的。但它只能通过constrvalue 引用来临时取一个:

void f(thing const & t);   // OK: const lvalue reference
void f(thing && t); // OK: rvalue reference
void f(thing & t); // Error: lvalue reference can't bind to temporary

通过引用传递不会创建新对象,并且临时对象的生命周期在函数调用期间有效,直到创建它的语句结束。

关于c++ - 将临时对象作为参数传递 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26105280/

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