我最近一直在玩 C++11,并想出了以下 sum 函数:
template <typename T>
inline T sum(const std::function<T (int)> &f, int initial, int end)
{
T retval = 0;
for(int k = initial; k <= end; k++) {
retval += f(k);
}
return retval;
}
这个想法是我可以传递一个 lambda 函数,从而为数学求和提供一个简洁易读的函数。然后我尝试了以下方法:
int main()
{
std::array<double, 2> arr1 = {{ 0.5, 1.5 }},
arr2 = {{ 1.5, -0.5 }};
auto n = sum<int>([&](int k) { return arr1[k]*arr2[k]; }, // Precision loss!
0, 1);
return 0;
}
我使用 g++ 4.6.3 编译了这个:g++ -Wall -pedantic -std=c++0x -o test main.cpp
并且没有给出任何关于我在源代码注释中提到的精度损失的警告。
这几乎是给定的,这sum<int>
是一件坏事,但在更复杂的环境中可能并不那么明显。编译器是否应该注意到我的 lambda 函数的返回值是double
并警告我在转换为时我失去了精度int
?有没有特定的原因?