Кресты / Говнокод #13628 Ссылка на оригинал

0

  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 LispGovno, (Updated )

Комментарии (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;
              }
          // ...
          };
          Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8