正常工作的示例
#include <iostream>
#include <vector>
struct MyClass{
const std::vector<float>::iterator& begin(){
return myvec.begin();
}
const std::vector<float>::iterator& end(){
return myvec.end();
}
std::vector<float> myvec;
};
int main(){
std::vector<float> mainvec(8,0);
MyClass myClass;
myClass.myvec = mainvec;
for (std::vector<float>::iterator it = myClass.begin();
it != myClass.end();++it){
std::cout << *it << " " ;
}
std::cout << std::endl;
}
在这段代码中,我得到了以下输出:
0 0 0 0 0 0 0 0
一个未能按预期工作的示例:
#include <iostream>
#include <vector>
struct MyClass{
const std::vector<float>::iterator& begin(){
return myvec.begin();
}
const std::vector<float>::iterator& end(){
return myvec.end();
}
std::vector<float> myvec;
};
int main(){
std::vector<float> mainvec(8,0);
MyClass myClass;
myClass.myvec = mainvec;
const std::vector<float>::iterator& end_reference = myClass.end();
for (std::vector<float>::iterator it = myClass.begin();
it != end_reference;++it){
std::cout << *it << " " ;
}
std::cout << std::endl;
}
在这段代码中,我得到了以下输出:
"empty output"
第一个代码示例
它存在问题,我错误地调用了向量begin()
和end()
而不是MyClass方法。
以下是我提出疑问的最小代码:
#include <iostream>
#include <vector>
struct MyClass{
const std::vector<float>::iterator& begin(){
return myvec.begin();
}
const std::vector<float>::iterator& end(){
return myvec.end();
}
std::vector<float> myvec;
};
int main(){
std::vector<float> mainvec(8,0);
MyClass myClass;
myClass.myvec = mainvec;
for (std::vector<float>::iterator it = myClass.myvec.begin();
it != myClass.myvec.end();++it){
std::cout << *it << " " ;
}
std::cout << std::endl;
}
我在第8行和第12行收到以下警告:
returning reference to local temporary object [-Wreturn-stack-address] [cpp/gcc]
但当我编译并运行程序时,我得到了以下结果:
0 0 0 0 0 0 0 0
所以,似乎当返回
myvec.begin()
时,本地引用并没有被销毁。当我第一次编写代码时,我认为这不会成为一个问题,因为在我的头脑中,向量的begin()方法会返回对第一个向量位置的迭代器引用,而对于我来说,这个迭代器在执行myvec.begin()时并没有被分配,但是它是对此迭代器的引用。所以,这个警告不应该出现,因为我没有分配内存。但由于我不知道这个机制是如何工作的,所以我想学习它以编写一致的代码。看起来我可以忽略这个警告,对吗?
begin()
返回引用的想法? - user3920237std::vector::begin()
的描述中,你看到任何提及引用结果的地方了吗?它返回一个对象。 - WhozCraigMyClass
的begin()
和end()
成员函数。相反,你直接调用了myClass.myvec.begin()
和myClass.myvec.end()
。你的 Ub-繁荣成员函数没有被调用。 - WhozCraig