码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-07-04 01:41:11      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:result   res   ++   span   NPU   引用   read   namespace   声明   

 

先看一个例子:

#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)和(03)恰好能够解决这个问题。

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

标签:result   res   ++   span   NPU   引用   read   namespace   声明   

原文地址:https://www.cnblogs.com/yb-blogs/p/13233172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!