在模板函数中使用initializer_list
Using initializer_list in template function
我正在尝试使用函数模板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
这是怎么回事?
std::initializer_list<T>
只能用作临时对象或函数参数,因为它引用了一个临时数组。
8.5.4/5-6:
类型为std::initializer_list<E>
的对象是从初始值设定项列表构造的,就好像实现分配了一个 N 个类型为
const E
的元素的临时数组,其中 N 是初始值设定项列表中的元素数。该数组与任何其他临时对象 (12.2( 具有相同的生存期,只是从数组初始化
initializer_list
对象会延长数组的生存期,就像将引用绑定到临时对象一样。
18.9/2:
类型
initializer_list<E>
的对象提供对类型为const E
的对象数组的访问。 [注意:一对指针或一个指针加上一个长度将是initializer_list
的明显表示。initializer_list
用于实现 8.5.4 中指定的初始值设定项列表。 复制初始值设定项列表不会复制基础元素。
因此,返回一个initializer_list
对象与
struct int_ref {
int& ref;
explicit constexpr int_ref(int& r) : ref(r) {}
};
int_ref func() {
int n = 5;
return int_ref(n);
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 使用"std::unordereded_map"映射到"std::list"对象
- GCC对可能有效的代码抛出init list生存期警告
- 使用std::list创建循环链表
- C2664 无法从'initializer list'转换参数
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 在C++中标记化"Braced Initializer List"样式字符串(使用 Boost?
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 无法从'initializer-list'转换为用户控制器
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- VS2015无法从'initializer list'转换为'std::string'错误
- 编译器错误:"Non-aggregates cannot be initialized with initializer list."
- 无法转换...从 '<brace-enclosed initializer list>' 到 地图
- 无法将'<brace-enclosed initializer list>'转换为'double'作为回报
- <function-style-cast> 错误:无法从'initializer list'转换为'std::thread'
- initializer语言 - list不能转换为const margin *