我有
-lz
并希望using namespace std; // for convenience in SO question only
vector<pair<array<int,3>, int>> foo;
emplace_back
持有pair::first
和{i,j,k}
持有pair::second
的元素。我得到这个编译的唯一方法是使用相当笨拙的
q
这是否有效(即保证 foo.emplace_back(piecewise_construct,
forward_as_tuple(i,j,k),
forward_as_tuple(q));
s将被优化掉)?或者还有另一种保证有效的方法吗?
(我试过了
tuple
但无法使用gcc 4.8.1)。我知道我可以通过定义
来避免这个问题foo.emplace_back(std::initializer_list<int>{i,j,k}, q);
但我宁愿没有这样的额外代码。
答案 0 :(得分:3)
std::array<T, N>
没有任何构造函数为std::initializer_list<U>
获取U
,甚至U = T
也没有。不要误以为它可以从braced-init-list初始化,以确定是否存在这样的构造函数。
相反,实际上是创建一个数组。
foo.emplace_back(std::array<int,3>{i,j,k}, q);
几乎没有任何关于效率的保证,这并不能保证比你的元组方法更有效。在实践中,它不应该产生太大的影响,我希望实现能够将emplace_back
的两种形式优化为相同的机器代码。如果你真的关心,而你怀疑,那么就衡量它。