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

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    template<typename V>
            constexpr Vector(V&& x, V&& y, V&& z) noexcept(std::is_lvalue_reference<V>::value ?
                    std::is_nothrow_move_constructible<V>::value  :
                    std::is_nothrow_copy_constructible<V>::value) :
                data{std::forward<V>(x), std::forward<V>(y), std::forward<V>(z)} {}

    Запостил: jangolare, 07 Августа 2016

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

    • Невероятно производительный конструктор!
      Ответить
    • говнокод настолько тонок, что чтобы понять что это говнокод, нужно прочитать четверть modern c++
      Ответить
    • А по моему std::is_lvalue_reference это не сработает, как хотелось?
      Ответить
      • Да.
        Ответить
        • он std::is_nothrow_move_constructible<V> и std::is_nothrow_copy_constructible<V> местами перепутал
          Ответить
          • Короче это многоуровневый говнокод. Сложно выделить какой-то отдельный косяк.
            Ответить
            • так там кроме перепутанных is_nothrow_*** больше проблем вроде нет
              Ответить
              • - is_lvalue_reference<V>::value для V &&arg всегда вернет false
                - Не учтено, что часть аргументов могут передаваться по lvalue, а другая - по rvalue
                - как ты сказал - перепутаны местами move|copy
                - а еще у меня смутное (но навязчивое) чувство, что constexpr там никогда не constexpr
                Ответить
                • > is_lvalue_reference<V>::value для V &&arg всегда вернет false

                  ORLY? http://coliru.stacked-crooked.com/a/e07a58d290c0f430

                  > Не учтено, что часть аргументов могут передаваться по lvalue, а другая - по rvalue

                  Тут да, ошибка компиляции будет.

                  > а еще у меня смутное (но навязчивое) чувство, что constexpr там никогда не constexpr

                  Если конструктор data constexpr, то всё ок.
                  Ответить
                • > is_lvalue_reference<V>::value для V &&arg всегда вернет false
                  Это почему? Если передать в конструктор некий T&, то как раз V = T&. А вот если T&&, то V = T.
                  Ответить
              • > V&& x, V&& y
                Вот это плохо работает. Например, если передать в качестве параметров lvalue и rvalue ссылки, то компилятор не сможет вывести V. Эта же проблема с разной константностью.

                Еще вместо этой опердени из тайптрейтов надо было использовать оператор noexcept: noexcept(noexcept(T(std::forward<V>(x))) )
                Ответить
    • Одного не пойму: что мешало написать
      template <typename T1, typename T2, typename T3>
      constexpr Vector(T1 x, T2 y, T3 z)
      noexcept(noexcept(decltype(data)(std::forward<T1>(x),std::forward<T2>(y),std::forward<T3>(z)))):
      ...
      Ответить
      • Вы имели в виду это?
        template<typename T1, typename T2, typename T3>
        constexpr Vector(T1&& x, T2&& y, T&& z) noexcept(noexcept(decltype(data)(std::forward<T1>(x))) && noexcept(decltype(data)(std::forward<T2>(y))) && noexcept(decltype(data)(std::forward<T3>(z))))
        ...
        Ответить
        • Здесь еще decltype(data) нужно просто на T поменять, а то не скомпилируется.
          Ответить
        • так конструктор data принимает три аргумента
          Ответить
          • А, если так, то тогда скомпилируется. Просто у меня там data - массив.
            Ответить

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