假设打击代码:
#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。
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,但你最好只构造数组并希望编译器为你优化。
| 归档时间: |
|
| 查看次数: |
684 次 |
| 最近记录: |