C++模板推导丢失引用问题

 

先看一个例子:

#include <numeric>
#include <vector>
#include <algorithm>
#include <iterator>
#include <thread>
#include <iostream>
#include <functional>

using namespace std;

template <typename Iterator, typename T>
struct accumulate_block
{
    void operator()(Iterator first, Iterator last, T &result)
    {
       //accumulate(first, last, result);                     //(1) main: 0 
       //accumulate<Iterator, T&>(first, last, (result));     //(2) main: 200
    result = accumulate(first, last, result);          //(3)main: 200
    }
};

template<typename Iterator, typename T>
T func(Iterator block_start, Iterator block_end, T result){
    thread t;
    t = thread(accumulate_block<Iterator, T>(), block_start, block_end, ref(result));
    t.join();
    return result;
}


int main()
{
    vector<int> vec(100, 2);
    int result = 0;
    result = func(vec.begin(), vec.end(), result);
    cout << result << endl;
}  

从上面的例子中可以得出,当执行标记(1)时,main的返回值是0,而(2)和(3)时main的返回值是200。

为什么在 void operator()(Iterator first, Iterator last, T &result)中穿的是T& 形式的result,而调用accumulate后却不能更改result的值呢。

我们看看accumulate的函数声明

template <class InputIterator, class T>
   T accumulate (InputIterator first, InputIterator last, T init);
会发现,accumulate这哥们的形参类型是T,而非T&
所以,当result传给accumulate时,T就被推导成了int,而非int&.
而(2)和(3)恰好能够解决这个问题。
posted @ 2020-07-03 23:16  yangbofun  阅读(258)  评论(0)    收藏  举报