在 Andrew Koenig 的《Accelerated C++》一书中,他展示了以下代码:
vector<double> emptyvec()
{
vector<double> v; // no elements
return v;
}
grade(midterm, final, emptyvec());
Run Code Online (Sandbox Code Playgroud)
现在,grade 函数接受对 的 const 引用vector<double>
。这对我来说意味着应该复制emptyvec()返回的临时对象,因为它是在堆栈中作为局部变量创建的,并且别名对我来说似乎很奇怪。这究竟是如何运作的?同样在另一页上,他将 const 引用传递给一个函数,该函数按值获取其参数并修改它们。是否可以将 const 引用vector<double>
传递给参数需要为 的函数vector<double>
?
这对我来说意味着应该复制返回的临时对象,
emptyvec()
因为它是作为局部变量在堆栈中创建的
绝对的,它确实被复制了。但是,它被复制到的位置是由编译器指定的,而不是由您的程序指定的。
如果编译器没有能力为常量引用传递临时值,您将被迫这样做:
vector<double> tmp(emptyvec());
grade(midterm, final, tmp);
Run Code Online (Sandbox Code Playgroud)
这几乎就是书中代码中幕后发生的事情,只是tmp
代码没有可访问的变量。
是否可以将 const 引用
vector<double>
传递给参数需要为 的函数vector<double>
?
是的,只要参数是按值传递,而不是按引用传递。回想一下,复制构造函数需要一个const
引用。当您调用一个接受vector<double>
并传递const vector<double>&
给它的函数时,C++ 会调用 的构造函数vector<double>
,向其传递一个常量引用,并在函数内使用生成的副本。