标签: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)恰好能够解决这个问题。
标签:result res ++ span NPU 引用 read namespace 声明
原文地址:https://www.cnblogs.com/yb-blogs/p/13233172.html