让我们假设有一些数据存储在一个数组中,需要通过一个接受向量的函数。在这种情况下,显然需要将阵列数据转换为相应的矢量类型。一般的方法是
std::vector<int> vec(arr, arr+n);
function(vec);
其中arr是提到的数组变量。我知道我们只添加了一行,但它看起来像是一种不必要的代码污染。所以我尝试了这个
function(std::vector<int>(arr, arr+n))
#include <vector>
#include <iostream>
void print(std::vector<int> vec){
for(unsigned int i=0; i!=vec.size(); ++i){
std::cout << vec[i] << std::endl;
}
}
int main(){
int a[] = {2,1,4,5,6};
print(std::vector<int>(a,a+5));
}
由此,我的第一个问题是:这种方法还可以,或者它有一些不良行为?
之后,我决定将函数参数更改为接受像
这样的向量引用void print(std::vector<int> &vec){
for(unsigned int i=0; i!=vec.size(); ++i){
std::cout << vec[i] << std::endl;
}
}
什么都行不通。这是我得到的错误
test.cpp: In function ‘int main()’:
test.cpp:13:34: error: invalid initialization of non-const reference of type ‘std::vector<int>&’ from an rvalue of type ‘std::vector<int>’
print(std::vector<int>(a,a+5));
^
test.cpp:4:6: error: in passing argument 1 of ‘void print(std::vector<int>&)’
void print(std::vector<int> &vec){
这是第二个问题:为什么,当函数参数偶然发生向量引用时,这种方法不起作用。有一点可以解决这个编译错误,保持在参数函数中创建向量对象的方法吗?
答案 0 :(得分:1)
问题是将rvalue
(函数调用中的std::vector<int>(a,a+5)
)绑定到函数参数列表中的lvalue reference
(std::vector<int> &vec
)。 rvalue
可以绑定到const lvalue reference
,因此只要参数不会被更改,最简单的解决方案是编写
void print(const std::vector<int> &vec)
这样可以在向量上保存一个复制操作。或者,您可以通过使用rvalues
参数将函数重载绑定显式写入rvalue reference
。
void print(std::vector<int>&& vec)
但是你必须要注意这个事实,这个重载只会 绑定到rvalues
。因此,您必须维护两个函数,一个用于lvalues
,另一个用于rvalues
。
有关lvalues
和rvalues
的进一步参考,请参阅示例Understanding lvalues and rvalues in C and C++或询问您最喜爱的搜索引擎; - )。
答案 1 :(得分:1)
在这行 print(std :: vector(a,a + 5))中,编译器创建一个临时对象,它是一个右值引用。这里我们试图将一个引用值传递给一个接受非const左值引用的函数,因此编译错误。相反,如果您声明print()方法接受右值引用,那么您可以摆脱编译错误。请参阅下面的代码段
<TabPane fx:id="tabPane" fx:controller="controllers.MainController"/>
关于左值,右值参考的更多信息,请参阅http://en.cppreference.com/w/cpp/language/reference