В настоящее время я изучаю шаблоны переменных, и в качестве небольшого упражнения, чтобы переварить некоторые вещи, о которых я читал, я написал небольшую функцию для вывода имен всех типов аргументов:
#include "stdafx.h"
#include <iostream>
#include <string>
template<typename Next, typename... Rest>
std::string get_arg_types(Next next, Rest... rest)
{
return std::string(typeid(Next).name()) + "\n" + get_arg_types(rest...);
}
template<typename Last>
std::string get_arg_types(Last last)
{
return std::string(typeid(Last).name());
}
int main()
{
float f = 0;
double d = 0;
int i = 0;
std::cout << get_arg_types(f, d, i);
return 0;
}
К моему удивлению, это скомпилировано с использованием VC ++ 12.0 и (кажется) работает нормально.
Я ожидал ошибку из-за неоднозначности между перегрузками, когда остался только один аргумент, потому что я прочитал этот шаблонПакет параметров может быть пустым / содержать 0 аргументов.
Итак, мой вопрос: почему это работает?Как решается «потенциальная двусмысленность»?Разве подпись для обеих функций не идентична только с 1 аргументом?Мне кажется, что я где-то пропустил какую-то важную концепцию, потому что приведенный выше пример не должен компилироваться, но, очевидно, я ошибаюсь.
С уважением:)