Я пытаюсь использовать шаблон функции foo
для преобразования аргументов в initializer_list
. Тем не менее преобразованный имеет странные значения, которые не совпадают с входными аргументами.Использование initializer_list в функции шаблона
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using namespace std;
template<class T>
void func(std::initializer_list<T> a_args)
{
if (a_args.begin() != a_args.end())
{
auto last = prev(a_args.end());
copy(a_args.begin(), last, ostream_iterator<int>(cout, ","));
cout << *last;
}
cout << endl;
}
template<class T, class ...Args>
struct first_of
{
typedef T type;
};
template<class ...Args>
initializer_list<typename first_of<Args...>::type> foo(Args&&... args)
{
return { forward<Args>(args)... };
}
int main()
{
func({1,2,3});
auto x = foo(1,2,3);
func(x); //this should be the same as func({1,2,3}) but not.
}
вывод выглядит следующим образом:
1,2,3
-326483696,32767,0
Что здесь не так?
Initializer не предназначены быть проведены и использоваться в дальнейшем. – chris
Копирование 'initializer_list' (например, при возврате из функции) не копирует базовые элементы. – jrok