C++ 模板函数不同的结果取决于引用类型
我正在制作一个包含两个迭代器的简单结构,我可以使用基于范围的for循环C++ 模板函数不同的结果取决于引用类型,c++,c++11,C++,C++11,我正在制作一个包含两个迭代器的简单结构,我可以使用基于范围的for循环 #include <vector> #include <iostream> #include <utility> template <class TIterator> struct Range { Range(const TIterator &begin, const TIterator &end) :_begin(begin), _end(end
#include <vector>
#include <iostream>
#include <utility>
template <class TIterator>
struct Range
{
Range(const TIterator &begin, const TIterator &end)
:_begin(begin), _end(end) {}
TIterator begin() { return _begin; }
TIterator end() { return _end; }
private:
TIterator _begin;
TIterator _end;
};
template <class TRange>
auto make_range(TRange r) -> Range<decltype(std::begin(r))>
{
return { std::begin(r), std::end(r) };
}
template <class TRange>
auto make_range2(TRange &r) -> Range<decltype(std::begin(r))>
{
return { std::begin(r), std::end(r) };
}
int main()
{
std::vector<int> vec = {1,2,3,4,5};
auto r = make_range(vec);
for (auto i : r)
{
std::cout << i << std::endl; // 0 0 3 4 5 or 0 2 3 4 5 depends on compiler
}
std::vector<int> vec2 = {1,2,3,4,5};
auto r2 = make_range2(vec2);
for (auto i : r2)
{
std::cout << i << std::endl; // 1 2 3 4 5
}
return 0;
}
#包括
#包括
#包括
模板
结构范围
{
范围(常数滴定仪和开始、常数滴定仪和结束)
:_begin(开始),_end(结束){}
TIterator begin(){return\u begin;}
TIterator end(){return\u end;}
私人:
滴定仪_开始;
滴定器_端;
};
模板
自动生成范围(交易r)->范围
{
返回{std::begin(r),std::end(r)};
}
模板
自动生成范围2(传输和恢复)->范围
{
返回{std::begin(r),std::end(r)};
}
int main()
{
向量向量向量={1,2,3,4,5};
自动r=制造范围(vec);
用于(自动i:r)
{
std::cout在make_范围(TRange r)中,r是向量的本地副本,它超出范围,使迭代器无效。在make_范围(TRange r)中,r是向量的本地副本,它超出范围,使迭代器无效。在make_范围(TRange r)中,r是向量的本地副本,它超出范围,使迭代器无效。在make_范围内(TRange r),r是向量的本地副本,它超出范围,使迭代器无效。make_range
按值获取其参数。r
是一个临时变量,当函数返回时将被销毁,使所有迭代器无效。随后尝试取消引用所述迭代器会显示未定义的行为。make_range
按值获取其参数。r
是一个临时变量,当函数返回时会被销毁,使其中的所有迭代器无效。随后尝试取消引用所述迭代器时会显示未定义的行为。make_range
按值获取其参数。r
是一个临时变量,是des当函数返回时抛出,使所有迭代器失效。随后尝试取消引用所述迭代器会显示未定义的行为。make\u range
按值获取其参数。r
是一个临时变量,当函数返回时会销毁,使所有迭代器失效。随后尝试解引用表示迭代器表现出未定义的行为