Это законный код C ++? - PullRequest
       2

Это законный код C ++?

0 голосов
/ 29 февраля 2012

Меня интересуют ответы со ссылкой на конкретный отрывок в стандарте, а не только общие мнения.

template <class T> struct wrapped
{
       wrapped(const T&) {}
};

template <class T> wrapped<T> wrappit(const T& x)
{
       return wrapped<T>(x);
}

template <class T> int run_function(const T& x, bool wrapped)
{
       if (wrapped) {
               return 0;
       } else {
               return run_function(wrappit(x), true) + 1;
       }
}

int main()
{
       const int result = run_function(0.5, false);
       return result;
}

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Соответствующая реализация может отклонить этот код. См. Приложение B к Стандарту.

Ваша реализация должна включать в свою документацию определенные ограничения, в том числе:

  • Рекурсивно вложенные экземпляры шаблонов
4 голосов
/ 29 февраля 2012

Из 14.7.1 (15):

Результат бесконечной рекурсии в экземпляре не определен.


Относительно вашего кода: вы не можете сделатьстатические условия с if.Вместо этого вам понадобится какой-то функциональный подход и частичная специализация:

template <typename T, bool> struct run_function;
template <typename T> struct run_function<T, true>
{
    static int go(T const & x) { return 0; }
};
template <typename T> struct run_function<T, false>
{
    static int go(T const & x)
    { return 1 + run_function<T, true>::go(wrappit(x)); }
};

Теперь больше нет бесконечной рекурсии, потому что две ветви используют различных шаблонов , которые в конечном итоге не создаютсядругие шаблоны.

...