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

标签 c++ reference

在 Andrew Koenig 的《Accelerated C++》一书中,他展示了以下代码:

vector<double> emptyvec()
{
    vector<double> v;    // no elements
    return v;
}

grade(midterm, final, emptyvec());

现在,等级函数采用对 vector<double> 的常量引用.这对我来说意味着应该复制 emptyvec() 返回的临时对象,因为它是在堆栈中创建的局部变量和别名,这对我来说似乎很奇怪。这究竟是如何运作的?同样在另一页上,他将 const 引用传递给一个函数,该函数按值获取其参数并修改它们。可以引用 vector<double>被传递给一个参数需要vector<double>的函数?

最佳答案

This means to me that the temporary object returned by the emptyvec() should be copied because it is created in the stack as a local variable

当然,它确实被复制了。但是,它被复制到的位置是由编译器指定的,而不是由您的程序指定的。

如果编译器没有为常量引用传递临时变量的能力,您将被迫这样做:

vector<double> tmp(emptyvec());
grade(midterm, final, tmp);

除了没有 tmp 之外,这几乎就是本书代码中幕后发生的事情。代码可访问的变量。

Can a const reference of vector<double> be passed to a function whose parameter expects vector<double>?

是的,只要参数是按值传递的,而不是按引用传递的。回想一下,复制构造函数接受 const。引用。当你调用一个带有 vector<double> 的函数时并通过 const vector<double>&对此,C++ 调用 vector<double> 的构造函数,将常量引用传递给它,并在函数内使用生成的拷贝。

关于c++ - 关于将临时对象传递给 const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201135/

相关文章:

javascript - 有条件地包含浏览器脚本

Java 字符串实例化

c++ - 谁能解释一下为什么两个 "results"不同?

c++ - 在 gcc 中的不兼容函数类型之间进行转换

c++ - Qt QMenu延迟初始化

c++ - 纹理显示不正确 C++ opengl SOIL

c++ - C++中的内存泄漏/内存分配

c++ - OpenGL 文本忽略转义序列

rust - 为什么不能在同一结构中存储值和对该值的引用?

c# - 预加载程序集 : referenced, 未引用,直到需要时才加载