Следующий код
#include <initializer_list>
#include <vector>
template<int ...>
const std::vector<int>*make_from_ints(int args...)
{ return new std::vector<int>(std::initializer_list<int>{args}); }
компилирует (с GCC 6.3, на Debian/Sid/x86-64) правильно, и я ожидаю его для вызова типа
auto vec = make_from_ints(1,2,3);
чтобы вернуть указатель на некоторый вектор целых чисел, содержащий 1, 2, 3.
Однако, если я заменил int
на double
, то есть, если я добавлю следующее (в том же файле basiletemplates.cc
...):
template<double ...>
const std::vector<double>*make_from_doubles(double args...)
{ return new std::vector<double>(std::initializer_list<double>{args}); }
Я получаю ошибку компиляции:
basiletemplates.cc:8:17: error: ‘double’ is not a valid type
for a template non-type parameter
template<double ...>
^~~
и я не понимаю, почему. Ведь оба int
и double
- это скалярные числовые типы POD (предварительно определенные в стандарте С++ 11).
Как получить вариационную функцию шаблона, чтобы иметь возможность кодировать:
auto dvec = make_from_doubles(-1.0, 2.0, 4.0);
и получить указатель на некоторый вектор удвоений, содержащий -1.0, 2.0, 4.0?
BTW, компиляция для С++ 14 (с g++ -Wall -std=c++14 -c basiletemplates.cc
) и использование clang++
(версия 3.8.1) вместо g++
ничего не менять.