Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 C++;11成对和元组的分段_构造的用例?_C++11_Tuples_Use Case_Forwarding_Piecewise - Fatal编程技术网

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)
); // 也很好
  • 那么,用例是什么
  • 如何以及何时使用
    分段构造

并非所有类型的移动都比复制更有效,对于某些类型,甚至明确禁用复制和移动也可能有意义。考虑<代码> STD::数组作为前一种类型的一个例子。

使用
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});