Разница между auto в шаблонном типе и типе шаблонной переменной

В чём разница между следующими объявлениями? Одинаковый ли код генерируется? Что лучше использовать?

template <auto X>
constexpr int x = X;

template <int X>
constexpr auto x = X;

Ответы (1 шт):

Автор решения: Harry

В первом случае на тип шаблонного параметра не накладывается строгое ограничение, надо лишь, чтобы его можно было привести в int, раз уж x имеет такой тип...

А во втором случае тип шаблонного параметра задан предельно точно — int и никак иначе. Соответственно, x автоматически имеет тип int.

Так что в таком коде получим в одном случае предупреждение, во втором — ошибку.

template <auto Y>
constexpr int y = Y;

template <int X>
    constexpr auto x = X;

int main()
{
    cout << y<3.5>;   // Предупреждение
    coun << x<4.5>;   // Ошибка
}
→ Ссылка