Рассмотрим следующий код:
template <typename... Types>
struct list
{
template <typename... Args>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
};
template <typename... Args>
list(Args...) -> list<Args...>;
int main()
{
list l{0, 0.1, 'a'};
}
Я ожидаю, что decltype(l)
будет list<int, double, char>
. К сожалению, g++ 7.2 и g++ trunk не дают статического утверждения. clang++ 5.0.0 и clang++ trunk компилируются и работают как ожидалось.
Это ошибка g++? Или есть причина, почему руководство по вычету не следует соблюдать здесь?
Добавление ограничения SFINAE для конструктора, по-видимому, обеспечивает желаемое поведение:
template <typename... Args,
typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}