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

    +145

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    Connection::Connection(const Options& opts): impl_(new Impl)
    {
        impl_->isInitialized = false;
        impl_->options = std::move(*opts.impl_);
       
        if (!options().lazyInit)
            conn();
    }

    Вся соль в строке 4: из объекта opts, переданного по константной ссылке, подло выжимают содержимое. Видимо, никто не пробовал создать два коннекта из одного объекта опций.

    Запостил: roman-kashitsyn, 28 Октября 2014

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

    • Вот поэтому публичные данные — плохо. Был бы нормальный геттер — хрен вышло бы.
      Ответить
      • Там не в паблике дело - impl_ - приватное поле, а Connection объявлен френдом. Дело в нарушении семантики.
        Ответить
        • показать все, что скрыто-
          Ответить
        • дайте угадаю.

          там делаются миллионы соединений в секунду, почему кто-то и подумал что std::move() будет хорошей идеей, что бы съэкономить не копировании?

          "premature optimization" в ее чистой форме.
          Ответить
          • Не вижу ничего плохого в том, чтобы избегать ненужного копирования, если есть такая возможность.
            Просто не нужно делать этого, нарушая логическую константность.

            Правильным подходом было бы передавать входной параметр по значению. Тогда бы ни у кого не возникало иллюзий.
            Ответить
    • показать все, что скрыто-
      Ответить
    • -
      Ответить
    • Она сразу согласилась с мужем, когда он рассказал историю Димы. Только её смутила его реакция, когда она его назвала Димошей. - Дима, извини, что назвала тебя Димошей, тебе, видимо, это неприятно.
      Ответить

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