1. C++ / Говнокод #14519

    +51

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    #include <iostream>
    using namespace std;
    
    int main() {
        const int ci = 42;
        auto f = [ci]() mutable { std::cout << ++ci << '\n'; };
        f();
        return 0;
    }

    http://ideone.com/0P72sN
    А слона то я и не приметил.

    Запостил: LispGovno, 07 Февраля 2014

    Комментарии (16) RSS

    • Подозреваю, что всё именно так из-за того что ответ на главный вопрос вселенной не 42+1.
      Ответить
    • а чего ты хотел добиться-то?
      Ответить
    • mutable в лямбдах относится только к константности самой функциии (лямбда это класс с определённым operator() const), объекты захватываемые лямбдой сохраняют константность и изменить её можно только const_cast'ом
      int ci = 42;
      auto f = [ci]() mutable { std::cout << ++ci << '\n'; };
      //↑ Не будет работать без mutable: попытка const-метода изменить член класса
      f();
      http://stackoverflow.com/a/10074041
      Ответить
    • Похожая фигня с ссылками вечно происходит. Приходится городить std::remove_reference(decltype(...))
      Ответить
      • Например?
        Ответить
        • Если есть ссылка 'x' на какой-нибудь std::map, то если ты хочешь получить тип ключа, ты не можешь просто написать decltype(x)::key_type. У ссылки нет "полей". Нужно обязательно убирать ссылку, и получается в итоге std::remove_reference<decltype(x)>::type ::key_type.
          Ответить
          • Я конечно не пробовал, но лямбда ссылки должна по значению по умолчанию захватывать при [=]. А то чисто проблема decltype. С шаблонами редко бывает подобное.
            Ответить
            • Забыл уточнить - я не про лямбды говорил. Просто проблема очень похожая - у выражения сложный тип со всякими ссылками или const-qualifier'ами, которые приходится ещё дополнительно убирать.
              Ответить

    Добавить комментарий