使用forward_as_tuple发送初始化列表

时间:2016-01-11 08:30:58

标签: c++11

假设打击代码:

#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。

1 个答案:

答案 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,但是你可能最好只构建数组并希望编译器为你优化。