Наконец-то я начал читать c + +11, и я не понимаю, почему требуются типы возвращаемого типа возврата.
Нашел следующий пример, который используется для выделения проблемы:
template<class Lhs, class Rhs>
decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs) {return lhs + rhs;}
Пример является незаконным, поскольку decltype(lhs+rhs)
не работает, поскольку идентификаторы lhs
и rhs
действительны только после фазы синтаксического анализа.
Я думаю, мой вопрос касается времени decltype
разрешения типа. Если я не ошибаюсь, ключевое слово decltype
используется для определения типа выражения во время компиляции.
Я не вижу недостатка в том, что decltype
выполняет разрешение типа после завершения синтаксического анализа (что будет отлично работать для приведенного выше примера). Я считаю, что это был бы более простой способ решить проблему...
Вместо этого стандарт С++ 11 предоставляет типы возвращаемых возвратов:
template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}
Я не сомневаюсь, что у меня что-то не хватает, поскольку я не вижу другого использования типов trailing-return-types. Где ошибка в моих рассуждениях?
Обратно-возвращаемые типы кажутся слишком сложным решением для меня, поскольку разрешение decltype
типа после разбора полного тела функции будет работать так же хорошо?