Kaf*_*fka 2 c++ lambda auto c++11 c++17
我编写了以下测试:
#include <cassert>
#include <iostream>
#include <string>
#include <cmath>
#include <functional>
// Works with std::function !
//std::function<double(double)> set_unary_operation(const std::string& unary)
auto set_unary_operation(const std::string& unary)
{
if(unary == "EXP")
return [](const double& x){ return std::exp(x);};
if(unary == "LOG")
return [](const double& x){ return std::log10(x);};
if(unary == "_LN")
return [](const double& x){ return std::log(x);};
if(unary == "ABS")
return [](const double& x){ return std::abs(x);};
return [](const double& x){return x;};
}
bool is_equal(double&& value, double&& test)
{
double epsilon = 0.0000001;
return (value-epsilon < test) && (value+epsilon > test);
}
int main()
{
// TEST OPERATOR --------------------------------------------------------------------------
{
std::string in = "EXP";
auto f = set_unary_operation(in);
std::cout << "f = EXP ; f(1) = "<< f(1) << "; f(2.5) = " << f(2.5) << std::endl;
assert(is_equal(f(1) , 2.71828182));
assert(is_equal(f(2.5), 12.1824939607));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我定义set_unary_operationas的返回类型,代码工作正常std::function<double(double)>,但是当我使用 auto 并显示以下消息时失败:
错误:自动返回类型的推导不一致:'moteur_de_calcul::set_unary_operation(const string&)::<lambda(const double&)>'然后是'moteur_de_calcul::set_unary_operation(const string&)::<lambda(const double&)>'
我试图理解为什么扣除失败(可以在这里找到示例:https : //onlinegdb.com/Sk7bitBxD)。
每个lambda 表达式都会产生唯一的闭包类型,
lambda 表达式是唯一未命名非联合非聚合类类型的纯右值表达式,称为闭包类型,在包含 lambda 的最小块范围、类范围或命名空间范围中声明(出于 ADL 的目的)表达。
这导致返回类型推导失败,因为它们不是相同的类型。
如果有多个 return 语句,它们必须都推导出相同的类型
正如您所说,您可以指定std::function为返回类型。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |