C ++ lambda和内联fizzbuzz

时间:2018-01-31 17:58:33

标签: c++ lambda conditional-operator fizzbuzz

Heoi,我已经看过一个C ++谈话,有人做了一个lambda 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 个答案:

答案 0 :(得分:4)

你的问题很清楚。由于std::ostreamint的类型不同,因此提供与三元运算符不同的类型会产生错误。要解决这个问题,您可能希望完全避免使用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"; };