簡體   English   中英

自動扣減失敗,提示“自動返回類型扣減不一致”

[英]auto deduction fails with message “inconsistent deduction for auto return type”

我寫了以下測試:

#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;
}

如果我將set_unary_operation的返回類型定義為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 表達式都會產生唯一的閉包類型,

The lambda expression is a prvalue expression of unique unnamed non-union non-aggregate class type, known as closure type, which is declared (for the purposes of ADL) in the smallest block scope, class scope, or namespace scope that contains the lambda表達。

這導致返回類型扣除失敗,因為它們不是相同的類型。

如果有多個return語句,它們必須都推導到相同的類型

正如您所說,您可以指定std::function作為返回類型。

lambda 只是 function object,每個 Z945F3FC449518A736B9F5F3286 都是唯一的。 這就是set_unary_operation()失敗的原因。 有關此問題的更多詳細信息,請參閱上面宋元瑤的回答。 有多種方法可以解決這個問題:

  • 返回std::function
  • 通過轉換為 function 指針返回(不適用於捕獲的 lambda):
    return +[](const double& x){ return std::exp(x);};
  • 您可以檢查 lambda 中的unary值並更改返回值,而不是為每種情況創建 lambda :
auto set_unary_operation(const std::string& unary)
{
    return [unary](const double& x)
    {
        if (unary == "EXP")
            return std::exp(x);
        if (unary == "LOG")
            return std::log10(x);
        //more cases..
    };
}
  • 你可以使用模板...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM