У C ++ 11 є два синтаксиси для оголошення функції:
аргументи-декларації ідентифікатора типу return ( ... )
і
auto ідентифікатор ( аргументу-декларації ... ) -> return_type
Вони рівноцінні. Тепер, коли вони рівноцінні, чому ви взагалі хочете використовувати останні? Ну, C ++ 11 представив цю класну decltypeріч, яка дозволяє описувати тип виразу. Тому ви можете отримати тип повернення з типів аргументів. Тож ви спробуйте:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
і компілятор скаже вам, що не знає, що aі bв decltypeаргументі. Це тому, що вони оголошені лише списком аргументів.
Ви можете легко вирішити проблему, використовуючи declvalпараметри шаблону, які вже оголошені. Подібно до:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
за винятком того, що зараз стає дійсно багатослівним. Тож альтернативний синтаксис декларації був запропонований та реалізований, і тепер ви можете писати
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
і вона менш докладна, і правила розміщення не потрібно змінювати.
Оновлення на C ++ 14: C ++ 14 також дозволяє лише
auto ідентифікатор ( аргументу-декларації ... )
до тих пір, поки функція буде повністю визначена перед використанням, і всі returnоператори виводяться до одного типу. ->Синтаксис залишається корисним для громадських функцій (оголошених в заголовку) , якщо ви хочете , щоб приховати тіло в вихідному файлі. Дещо очевидно, що неможливо зробити з шаблонами, але є деякі конкретні типи (як правило, отримані за допомогою метапрограмування шаблонів), які важко написати інакше.