У 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
оператори виводяться до одного типу. ->
Синтаксис залишається корисним для громадських функцій (оголошених в заголовку) , якщо ви хочете , щоб приховати тіло в вихідному файлі. Дещо очевидно, що неможливо зробити з шаблонами, але є деякі конкретні типи (як правило, отримані за допомогою метапрограмування шаблонів), які важко написати інакше.