使用 forward_as_tuple 发送初始化列表

Moh*_*miz 3 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;
}
Run Code Online (Sandbox Code Playgroud)

我想std::array使用初始化列表放置 a 。但我收到了这个错误:

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
     ^
Run Code Online (Sandbox Code Playgroud)

我知道有很多方法可以实现这一点,但我的问题是关于forward_as_tuple为什么它不简单地将初始化列表发送到的构造函数的错误行为std::array?

我使用 c++11 和 g++-4.8.4。

Tar*_*ama 5

forward_as_tuple({1, 2})
Run Code Online (Sandbox Code Playgroud)

支撑初始化器不能std::initializer_list像那样完美地转发和推导,您需要显式转换它们:

forward_as_tuple(std::initializer_list<int>{1,2})
Run Code Online (Sandbox Code Playgroud)

然而,虽然std::array由于聚合初始化可以用大括号初始化,但它没有std::initializer_list构造函数。如果你真的想要这种初始化,你可以使用std::vector,但你最好只构造数组并希望编译器为你优化。