C++ лямбда и встроенный fizzbuzz

Хей, я видел разговор на C++, где кто-то сделал лямбда-реализацию fizzbuzz.

Это не так! Даже близко к этому! У меня вопрос, почему я не могу использовать ostream&

auto fizz = [](int& x, std::ostream& os) { x % 3 == 0 ? os << "fizz" : 0; };
auto buzz = [](int& x, std::ostream& os) { x % 5 == 0 ? os << "buzz" : 0; };


    for (int i = 0; i != 100; ++i)
    {
        fizz(i, std::cout);
        buzz(i, std::cout);
    }

И мое сообщение об ошибке:

        E1776   function "std::basic_ostream<_Elem, _Traits>::basic_ostream(const std::basic_ostream<_Elem, _Traits>::_Myt &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 83 of "c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\include\ostream") cannot be referenced -- it is a deleted function    56  

1 ответ

Ваша проблема вполне понятна. поскольку std::ostream а также int не относятся к одному типу, при условии, что типы, не совпадающие с троичным оператором, создают ошибку. Чтобы решить эту проблему, вы, вероятно, хотите вообще избежать предложения else, поэтому ваши функции будут выглядеть так:

auto fizz = [](int& x, std::ostream& os) { if (x % 3 == 0) os << "fizz"; };
auto buzz = [](int& x, std::ostream& os) { if (x % 5 == 0) os << "buzz"; };

Другие вопросы по тегам