Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在c++;? 我正在学习C++。 我学会了如何避免抄袭。 所以我试图得到一个向量的迭代器作为引用来覆盖它的元素 // simplified function std::vector<int>::iterator& GetIterator(std::vector<int>& vec) { return vec.begin(); // compiler said that here is an error. } //简化函数 std::vector::iterator和GetIterator(std::vector和vec){ return vec.begin();//编译器说这里有一个错误。 }_C++ - Fatal编程技术网

为什么在c++;? 我正在学习C++。 我学会了如何避免抄袭。 所以我试图得到一个向量的迭代器作为引用来覆盖它的元素 // simplified function std::vector<int>::iterator& GetIterator(std::vector<int>& vec) { return vec.begin(); // compiler said that here is an error. } //简化函数 std::vector::iterator和GetIterator(std::vector和vec){ return vec.begin();//编译器说这里有一个错误。 }

为什么在c++;? 我正在学习C++。 我学会了如何避免抄袭。 所以我试图得到一个向量的迭代器作为引用来覆盖它的元素 // simplified function std::vector<int>::iterator& GetIterator(std::vector<int>& vec) { return vec.begin(); // compiler said that here is an error. } //简化函数 std::vector::iterator和GetIterator(std::vector和vec){ return vec.begin();//编译器说这里有一个错误。 },c++,C++,但编译器给了我一个错误消息,并建议使用const引用。 我不想使用const。 为什么它不能获得非常量引用? 或者如何避免复制迭代器? 非常感谢。vec.begin()返回一个临时对象,为r值。不能将l值引用绑定到r值。从GetIterator函数返回后,该临时对象将被销毁,您的引用将被挂起 按值(std::vector::iterator)而不是引用返回迭代器s设计为可复制且复制成本低。编译器还使用返回值优化来避免处理对象的成本返回一个临时对象,为r值。不能将l值引用绑定到r值。从GetIte

但编译器给了我一个错误消息,并建议使用const引用。 我不想使用const。 为什么它不能获得非常量引用? 或者如何避免复制迭代器? 非常感谢。

vec.begin()返回一个临时对象,为r值。不能将l值引用绑定到r值。从
GetIterator
函数返回后,该临时对象将被销毁,您的引用将被挂起

按值(
std::vector::iterator
)而不是引用返回<代码>迭代器
s设计为可复制且复制成本低。编译器还使用返回值优化来避免处理对象的成本返回一个临时对象,为r值。不能将l值引用绑定到r值。从
GetIterator
函数返回后,该临时对象将被销毁,您的引用将被挂起


按值(
std::vector::iterator
)而不是引用返回<代码>迭代器s设计为可复制且复制成本低。编译器还使用返回值优化来避免处理对象的成本。

正确的代码

std::vector<int>::iterator GetIterator(std::vector<int>& vec) {
    return vec.begin();  // compiler said that here is an error.
}
std::vector::iterator GetIterator(std::vector&vec){
return vec.begin();//编译器说这里有一个错误。
}
您的
是额外的

迭代器类似于
int*
,并获取地址
std::vector::iterator
就是这样。

因此
vector.begin()
类似于
&int
,因此不能将其绑定到
迭代器&
正确的代码

std::vector<int>::iterator GetIterator(std::vector<int>& vec) {
    return vec.begin();  // compiler said that here is an error.
}
std::vector::iterator GetIterator(std::vector&vec){
return vec.begin();//编译器说这里有一个错误。
}
您的
是额外的

迭代器类似于
int*
,并获取地址
std::vector::iterator
就是这样。

因此
vector.begin()
类似于
&int
,因此您不能将其绑定到
迭代器&

,有时您可以使用引用来避免复制,但这里您需要一个副本。
vec.begin()。如果您想要函数之外的值,并且确实需要,则需要一个副本。(如果您在这里成功地形成了一个引用,那么它将是一个“悬空引用”,这不是一件好事。)

在任何情况下,许多类型都被设计为高效复制,迭代器就是其中之一。事实上,编译器通常可以为您避免复制,而无需您做任何工作——这就是其中之一


因此,没有引用的代码更简单、正确,而且已经是最佳的。

您有时可以使用引用来避免复制,但这里您需要一个副本。
vec.begin()。如果您想要函数之外的值,并且确实需要,则需要一个副本。(如果您在这里成功地形成了一个引用,那么它将是一个“悬空引用”,这不是一件好事。)

在任何情况下,许多类型都被设计为高效复制,迭代器就是其中之一。事实上,编译器通常可以为您避免复制,而无需您做任何工作——这就是其中之一


因此,没有引用的代码更简单、正确,而且已经是最佳的。

vec.begin()
按值返回。因此,想想这个引用会引用什么。你得到的确切错误信息是什么?为什么你想避免复制迭代器?@ Mula对于向量,我希望迭代器的成本与引用的成本完全相同。在这一点上,IM C++的职业,除了功能参数之外,不接触引用。特别是,永远不要从函数返回引用。
vec.begin()
按值返回。因此,想想这个引用会引用什么。你得到的确切错误信息是什么?为什么你想避免复制迭代器?@ Mula对于向量,我希望迭代器的成本与引用的成本完全相同。在这一点上,IM C++的职业,除了功能参数之外,不接触引用。特别是,永远不要从函数返回引用。谢谢你告诉我为什么我的代码是错误的以及如何做。您的指令清晰明了。@MRB返回一个临时对象,是r值引用。这不是右值引用,它只是右值。谢谢你告诉我为什么我的代码是错误的以及如何做。您的指令清晰明了。@MRB返回一个临时对象,是r值引用。它不是右值引用,它只是右值。