C++11 C++;11成对和元组的分段_构造的用例?
在中,我找到了成对(和元组)的分段构造的描述(在新标准中) 但我不知道什么时候该用它。我找到了关于就业和不可复制实体的讨论,但当我尝试时,我无法创建一个我需要C++11 C++;11成对和元组的分段_构造的用例?,c++11,tuples,use-case,forwarding,piecewise,C++11,Tuples,Use Case,Forwarding,Piecewise,在中,我找到了成对(和元组)的分段构造的描述(在新标准中) 但我不知道什么时候该用它。我找到了关于就业和不可复制实体的讨论,但当我尝试时,我无法创建一个我需要piecewiese\u构造或可以看到性能优势的案例 例如。我想我需要一个不可复制但可移动的类(转发时需要): 然后我有点期待标准对构造会失败: pair<NoCopy,NoCopy> x{ NoCopy{1,2}, NoCopy{2,3} }; // fine! 对x{NoCopy{1,2},NoCopy{2,3};//好的
piecewiese\u构造
或可以看到性能优势的案例
例如。我想我需要一个不可复制但可移动的类(转发时需要):
然后我有点期待标准对构造会失败:
pair<NoCopy,NoCopy> x{ NoCopy{1,2}, NoCopy{2,3} }; // fine!
对x{NoCopy{1,2},NoCopy{2,3};//好的
但事实并非如此。事实上,这正是我所期望的,因为“移动内容”而不是在stdlib中到处复制它,这是应该的
因此,我看不出我有什么理由这样做,或者说:
pair<NoCopy,NoCopy> y(
piecewise_construct,
forward_as_tuple(1,2),
forward_as_tuple(2,3)
); // also fine
y对(
分段_构造,
前向数组(1,2),
前向数组(2,3)
); // 也很好
- 那么,用例是什么
- 如何以及何时使用
分段构造
emplace
函数和分段构造
的要点是这样一个类可以就地构造,而无需创建要移动或复制的临时实例
struct big {
int data[100];
big(int first, int second) : data{first, second} {
// the rest of the array is presumably filled somehow as well
}
};
std::pair<big, big> pair(piecewise_construct, {1,2}, {3,4});
分段构造对的主要用例是将元素放入映射
或无序映射
:
std::map<int, big> map;
map.emplace(std::piecewise_construct, /*key*/1, /*value*/{2,3});
std::map;
安放(std::分段_构造,/*键*/1,/*值*/{2,3});
尝试禁用移动构造函数。您描述得很好,谢谢。我也是这么想的。但是如果禁用在目标类上移动(使用=delete
),则对(分段_构造,…)
不起作用。我用gcc-4.7.0进行了尝试,但得到了一个编译错误。原因:实现pair
:模板对(分段构造,元组第一,元组第二):第一(uu cons(std::move(u first))),第二(u cons(std::move(u second)){}
,如您所见,需要移动。emplace似乎没有被使用。好的,gcc-4.7.0似乎还没有提供map.emplace()
。但这仍然留下了我关于对(分段_构造,{…},{…})
的问题。这是否适用于不可复制和不可移动的对象?从Std 20.3.2.(14)中的配方来看,可能是这样。虽然使用了“转发”,但它似乎适用于构造函数的参数,而不适用于对象本身(在哪里可能需要移动?。@towi:我认为gcc-4.7.0+libstdc++对于具有分段_构造的成对构造函数是不兼容的。不可复制和不可移动的对象应该可以工作,例如clang+libc++可以给出正确的结果@约翰内斯德:我不明白你为什么认为map.emplace应该与分段_构造一起工作?我知道的每个建议似乎都暗示emplace的用法应该是map.emplace(Key,ArgForValue…
,例如map.emplace(/*Key*/1,/*value*/2,3)
(这就是clang+libc++的行为)map.emplace(std::pieclewise_-construct,/*key*/1,/*value*/{2,3})代码>不编译,而是应该使用map.emplace(std::pieclewise_构造,std::forward_as_元组(1),std::forward_as_元组(2,3))代码>作为std::pair
的适当构造函数是templatepair(std::分段构造,std::元组第一个参数,std::元组第二个参数)代码>std::pair pair(分段_构造,{1,2},{3,4})代码>也不编译
std::vector<big> vec;
vec.emplace_back(1,2);
std::map<int, big> map;
map.emplace(std::piecewise_construct, /*key*/1, /*value*/{2,3});