自动扣除失败并显示消息“自动返回类型扣除不一致”

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)。

son*_*yao 5

每个lambda 表达式都会产生唯一的闭包类型,

lambda 表达式是唯一未命名非联合非聚合类类型的纯右值表达式,称为闭包类型,在包含 lambda 的最小块范围、类范围或命名空间范围中声明(出于 ADL 的目的)表达。

这导致返回类型推导失败,因为它们不是相同的类型。

如果有多个 return 语句,它们必须都推导出相同的类型

正如您所说,您可以指定std::function为返回类型。