【发布时间】:2020-01-10 02:36:10
【问题描述】:
如何将int 转换为long 内/外的lambda 表达式正确?如何正确检查 lambda 中的数学溢出?
int n = 12; // input parameter from std::cin
int a = 23; // input parameter from std::cin
int i = 34; // input parameter from std::cin
auto f = [n, a] (int i) { return a * (n - (i - 1)); };
auto result = f(i);
在 lambda 内部/外部乘以整数后检查溢出的最佳方法是什么?
auto result = f(i);
if ((result > std::numeric_limits<int>::max()) || (result < std::numeric_limits<int>::min())) {
cout << "overflow was detected" << endl;
}
我是否需要将 TRT(尾随返回类型)-> long 添加到 lambda 以便从 int 正确转换为 long?
auto f = [n, a] (int i) -> long { return a * (n - (i - 1)); };
我是否需要将 static_cast 添加到 lambda 才能从 int 正确转换为 long:
auto f = [n, a] (int i) { return static_cast<long>(a) * (n - (i - 1)); };
或者,可能是,我需要结合这个?
auto f = [n, a] (int i) -> long { return static_cast<long>(a) * (n - (i - 1)); };
或者,可能,我需要写 lambda 的类型?
std::function< long( int ) > f = [n, a] (int i) { return a * (n - (i - 1)); };
【问题讨论】:
-
为什么在这些问题中涉及 lambda 很重要? Lambdas 并不特别。它们只是代码。
-
@NicolBolas:如果 lambda 参数是
auto,这将很重要,因为这样选择合适的类型来保存乘法比如果不是。 -
@G.Sliepen:即使他们确实使用了
auto,这与无约束的模板参数到常规函数没有什么不同。因此,即便如此,作为一个 lambda 表达式也与如何检测/防止数学运算中的整数溢出问题真正相关。
标签: c++ lambda c++17 static-cast trailing-return-type