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

    +9

    1. 1
    // When F does not contain result_type, result_of<F(T1, T2, ..., TN)>::type is F::result<F(T1, T2, ..., TN)>::type when N > 0 or void when N = 0.

    http://www.boost.org/doc/libs/1_54_0/libs/utility/utility.htm#result_of
    > void when N = 0.
    Создатели boost::result_of решили, что если функция принимает 0 аргументов, то она не может ничего возвращать кроме void.

    Запостил: LispGovno, 20 Августа 2013

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

    • Улыбнуло.
      Ответить
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1454.html

      result_of<F()>::type: the zero-argument case must differ from cases with one or more arguments when the return type is not easily deducible (e.g., via a function pointer, member function pointer, implementation-specific deduction, or result_type member) due to the C++ template class instantiation rules. When a template class is instantiated, the declarations of every non-template member function are instantiated. This poses a problem for function objects attempting to accept zero arguments, because the declaration of the zero-argument operator() (and, correspondingly, result_of<F()>) will be instanted even if the function is not called. However, the underlying function object may not accept zero arguments (and, thus, F::result<F()>::type may be ill-formed).
      
      The cost of this special case is that function objects accepting zero arguments must specialize result_of for zero arguments or provide a single result type via result_type.


      Ох кресты вы мои кресты... Когда я вас изучу - я стану стареньким, да?

      Когда мы пишем result_of<F()>, то инстанцируются все operator() (со всеми const volatile и rvalue_this перегрузками), не смотря на то, что они не вызываются (а не должны, как это происходит при использовании result_of для унарной- энАрной функции). Создателей это расстроило и для std::result_of\boost::result_of они решили сделать, чтобы пользователи сами писали специализацию std::result_of для своих классов или не использовали нулярные функции, передавая туда фиктивный параметр.
      Ответить
      • Всё заибись, Говно.
        Не принимаешь аргументов - пиши руками, нехер глобальное состояние юзать без явного на то указания.
        Функциональщико-бляди ведб должны быть довольны.
        Ответить
        • А вдруг у меня константа возвращается
          Ответить
          • Например функция, считающая машинный эпсилон. Ничего не принимает, а-таки вертает.
            Ответить
        • Глобальное? А если это метод, а не голая функция, то оно не совсем глобальное ;)
          Ответить
          • Вы мне напомнили один смешной класс из проекта
            extern int SQL_QUERY_LENGTH_LIMIT;
            class sql
            {
            public:
            // ...
                void set_limit_length(int lim)
                {
                    SQL_QUERY_LENGTH_LIMIT = lim;
                }
            // ...
            };
            Ответить

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