Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++_C++11 - Fatal编程技术网

C++ 模板函数不同的结果取决于引用类型

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

我正在制作一个包含两个迭代器的简单结构,我可以使用基于范围的for循环

#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
是一个临时变量,当函数返回时会销毁,使所有迭代器失效。随后尝试解引用表示迭代器表现出未定义的行为