1

Вопрос по c++11, c++ – С ++ и карри

Я использую код:

#include <iostream>

using namespace std;

auto fn = ([](int x){
       return [x](int y) {
          return x * y;
       };
});

int main() {

    int i = fn(2)(4); // 8

    cout << i << endl;

    return 0;
}

Этот код работает нормально. Однако позже я хочу вызвать вторую функцию, например:

auto i = fn(2);

i(4); //error: 'i' cannot be used as a function

Есть ли способ вызвать последнюю функцию позже, а затем связать с первым вызовом?

  • действительно, он не компилируется. По крайней мере с g ++

    от
  • Я имею в виду, конечно, чтоint i = fn(2); не компилируется,auto i = fn(2) делает; Я использую g ++ 4.5, но странно, что 4.7 компилируется без предупрежденияint i = fn(2), посколькуfn(2) это не int

    от
  • С g ++ 4.7 отлично работает!

    от Opsa
  • Вы имели в виду auto i = fn (2)?

    от Vaughn Cato
  • @ Вон Катон, да! Спасибо

    от Opsa
  • 1

    Это работает для меня:

    int main() {
        auto i = fn(2);
        cout << i(4) << endl;  // prints 8
        return 0;
    }
    

  • 5

    Результат

    fn не является целым числом, поэтому вы не можете назначитьfn(2) в целое число (даже не знаю, почему это компилируется).

    Вы должны быть в состоянии сделатьauto i = fn(2);

  • 6

    Следующие работы, как ожидалось

    #include <iostream>
    
    using namespace std;
    
    auto fn = [](int x){
           return [x](int y) {
              return x * y;
           };
      };
    
    int main() {
    
        auto i = fn(2)(4); // 8
        cout << i << endl;
        auto j = fn(2);
        cout << j(4) << endl;
    
        return 0;
    }
    

    ADD

    Кстати, gcc 4.5 с -std = c ++ 0x выдает следующую ошибку, если вы используете int вместо auto:

    currying.cpp:17:17: error: cannot convert ‘<lambda(int)>::<lambda(int)>’ to ‘int’ in initialization
    currying.cpp:19:16: error: ‘j’ cannot be used as a function
    

    что является "очевидным" и полезную информацию, чтобы понять, что происходит не так.