为什么不能将此参数包直接解包到向量初始值设定项列表中?
Why can't this argument pack be unpacked directly into a vector initializer list?
我不明白为什么代码片段中注释掉的行不起作用。另外,vec
的实际类型是什么?看起来它也可以匹配 std::list
的初始化格式。
我仔细查看了 this and 是最终给了我工作解决方案的东西,但现在我不明白为什么它有效而注释行不起作用,或者你如何知道实际类型(因此 time/memory 的复杂性)vec
.
#include <iostream>
#include <vector>
template <class ...T>
void func(T... arg_name) {
// std::vector<T> vec{arg_name...};
auto vec{arg_name...};
for (auto i : vec) {
std::cout << i << std::endl;
}
}
int main()
{
func(1, 2, 3, 4);
}
当我取消注释 std::vector<T> vec{arg_name...}
并注释掉 auto vec{arg_name...}
时收到的错误消息是
In function 'void func(T ...)':
8:20: error: parameter packs not expanded with '...':
8:20: note: 'T'
10:19: error: range-based 'for' expression of type 'auto' has incomplete type
T
是参数包,而vector
取一个类型参数作为元素的类型,可以用common_type
到select它:
std::vector<std::common_type_t<T...>> vec{arg_name...};
我不明白为什么代码片段中注释掉的行不起作用。另外,vec
的实际类型是什么?看起来它也可以匹配 std::list
的初始化格式。
我仔细查看了 this and vec
.
#include <iostream>
#include <vector>
template <class ...T>
void func(T... arg_name) {
// std::vector<T> vec{arg_name...};
auto vec{arg_name...};
for (auto i : vec) {
std::cout << i << std::endl;
}
}
int main()
{
func(1, 2, 3, 4);
}
当我取消注释 std::vector<T> vec{arg_name...}
并注释掉 auto vec{arg_name...}
时收到的错误消息是
In function 'void func(T ...)':
8:20: error: parameter packs not expanded with '...':
8:20: note: 'T'
10:19: error: range-based 'for' expression of type 'auto' has incomplete type
T
是参数包,而vector
取一个类型参数作为元素的类型,可以用common_type
到select它:
std::vector<std::common_type_t<T...>> vec{arg_name...};