Не могли бы вы объяснить или дать ссылку, которая объясняет: почему это работает:
template <int i, int j, class T>
auto to_pair(T tuple) -> decltype(std::make_pair(std::get<i>(tuple), std::get<j>(tuple)))
{
return std::make_pair(std::get<i>(tuple), std::get<j>(tuple));
}
а этого нет?
template <class T>
auto to_pair(int i, int j, T tuple) -> decltype(std::make_pair(std::get<i>(tuple), std::get<j>(tuple)))
{
return std::make_pair(std::get<i>(tuple), std::get<j>(tuple));
}
Я имею в виду, в чем разница между типом int, являющимся специализацией аргументов шаблона, и аргументом int в качестве общего аргумента?





I mean what is the difference between int type being template argument specialization and int argument as a common argument?
Один определяется во время компиляции, а другой - во время выполнения.
Значение времени выполнения нельзя использовать в качестве параметра шаблона. Следовательно, второй случай не работает.
Типы известны, но не их значения. Когда вы используете std::get<i>(tuple), значение i должно быть известно во время компиляции.
но почему второй случай известен во время выполнения? Я имею в виду, что to_pair будет скомпилирован с переменными i, j, поэтому их типы известны?