关于将临时对象传递给 const 引用

meg*_*uli 7 c++ reference

在 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>

das*_*ght 5

这对我来说意味着应该复制返回的临时对象,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>,向其传递一个常量引用,并在函数内使用生成的副本。