【问题标题】:Use of lambda expression in C++ ternary operator : error type mismatch在 C++ 三元运算符中使用 lambda 表达式:错误类型不匹配
【发布时间】:2021-01-02 20:47:58
【问题描述】:

我只是在探索 lambda 表达式并尝试使用它从使用 C++ 三元运算符的函数中返回。但是下面的代码不能正常工作!

这是程序的简化版本,用于解释我的实际问题,因此请仅使用 lambda 发布答案,而不仅仅是返回 (x+y+offset)。

在成员函数'int Calculator::add(int, int)'中:12:26:错误:否 匹配三元 'operator?:' (操作数类型为 'bool'、'int' 和 'Calculator::add(int, int)::') 16:3:警告:控制 到达非空函数的结尾[-Wreturn-type]

    #include <iostream>
    #include <string>
    
    class Calculator
    {
      public:
      bool initalized = false;
      int offset = 0;
      
      int add(int x, int y)
      {
          return !initalized ? -1 : [this, x, y]()
          {
              return ((x+y) + offset);
          };
      }
    };
    
    int main()
    {
        Calculator c;
        c.initalized = true;
        c.offset = 1;
    
        printf("%d", c.add(2,10));
    }

我在这里做错了什么?

【问题讨论】:

  • 你必须调用lambda,-1和lambda没有通用类型
  • 你能通过代码sn-p告诉我吗?

标签: c++11 lambda conditional-operator


【解决方案1】:

我在这里做错了什么?

三元表达式的真假部分不兼容。不能将 -1 转换为 lambda 表达式,也不能将 lambda 表达式转换为 int

我不清楚你想用 lambda 表达式做什么,但它可以是:

return !initalized ? -1 : (x + y + this->offset);

如果您出于某种原因需要使用 lambda 表达式,则必须调用 lambda 表达式。

return !initalized ? -1 : [this, x, y]() { return ((x+y) + this->offset); }();
//                                                                 missing ^^

【讨论】:

  • 这明白了,我写了一个简化的程序来模拟实际问题。我的问题是如何使用 lambda 函数来做到这一点!
【解决方案2】:

您的三元运算符尝试返回 -1 或 lambda,它们没有通用类型。

您需要实际调用 lambda:

return !initalized ? -1 : [this, x, y]()
      {
          return ((x+y) + offset);
      }(); // <= added () 

或者没有 lambda:

return !initalized ? -1 : x+y+offset;

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 2022-01-21
    • 2012-07-03
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多