假设打击代码:
#include <map>
using namespace std;
int main(int argc, char *argv[])
{
map<int, std::array<int, 2>> a;
a.emplace(piecewise_construct,
forward_as_tuple(1),
forward_as_tuple({1, 2}));
return 0;
}
我想使用初始化列表来放置std::array
。但我得到了这个错误:
foo.cc: In function ‘int main(int, char**)’:
foo.cc:13:36: error: too many arguments to function ‘std::tuple<_Elements&& ...> std::forward_as_tuple(_Elements&& ...) [with _Elements = {}]’
forward_as_tuple({1, 2}));
^
In file included from /usr/include/c++/4.8/bits/stl_map.h:63:0,
from /usr/include/c++/4.8/map:61,
from foo.cc:3:
/usr/include/c++/4.8/tuple:869:5: note: declared here
forward_as_tuple(_Elements&&... __args) noexcept
^
我知道有很多方法可以实现这一点,但我的问题是forward_as_tuple
错误的行为为什么它不是简单地将初始化列表发送给std::array
的构造函数?
我使用的是c ++ 11和g ++ - 4.8.4。
答案 0 :(得分:4)
forward_as_tuple({1, 2})
支持的初始化程序无法完美转发并推导为std::initializer_list
,您需要明确转换它们:
forward_as_tuple(std::initializer_list<int>{1,2})
但是,尽管由于聚合初始化而可以使用大括号初始化std::array
,但它没有std::initializer_list
构造函数。如果你真的想要这种初始化,可以使用std::vector
,但是你可能最好只构建数组并希望编译器为你优化。