草庐IT

nothrow_move_constructible

全部标签

c++ - std::array 应该有 move 构造函数吗?

在std::array上不能有效地实现move(O(1)),那么为什么它有move构造函数呢? 最佳答案 std::array有一个编译器生成的move构造函数,它允许将一个实例的所有元素move到另一个实例中。如果元素可有效move或仅可move,这将很方便:#include#includestructFoo{Foo()=default;Foo(Foo&&){std::couta;std::arrayb=std::move(a);}所以我想说std::array应该有一个move复制构造函数,特别是因为它是免费的。没有一个需要它被

未调用 C++11 move 构造函数,首选默认构造函数

假设我们有这个类:classX{public:explicitX(char*c){cout这个示例用法:Xx("test");cout输出是:ctortestcopytestctor我正在使用默认设置的VS2010。我希望最后一个对象(z)是move构造的,但事实并非如此!如果我使用Xz(move(X("test")));那么输出的最后几行是ctormovetest,正如我所料。是(N)RVO的情况吗?问:是否应该按照标准调用move-ctor?如果是,为什么不叫它? 最佳答案 你看到的是copyelision,它允许编译器直接将临

未调用 C++11 move 构造函数,首选默认构造函数

假设我们有这个类:classX{public:explicitX(char*c){cout这个示例用法:Xx("test");cout输出是:ctortestcopytestctor我正在使用默认设置的VS2010。我希望最后一个对象(z)是move构造的,但事实并非如此!如果我使用Xz(move(X("test")));那么输出的最后几行是ctormovetest,正如我所料。是(N)RVO的情况吗?问:是否应该按照标准调用move-ctor?如果是,为什么不叫它? 最佳答案 你看到的是copyelision,它允许编译器直接将临

c++ - 为什么不使用 `make_x()` 函数尽可能省略 move 构造函数?

我不知道为什么在最后一种情况下是在启用复制省略时调用move构造函数(甚至是强制性的,例如在C++17中):classX{public:X(inti){std::clogXmake_X(T&&arg){returnX(std::forward(arg));}intmain(){autox1=make_X(1);//1xconvertingctorinvokedautox2=X(X(1));//1xconvertingctorinvokedautox3=make_X(X(1));//1xconvertingand1xmovectorinvoked}在这种情况下,哪些规则会阻碍move构造

c++ - 为什么不使用 `make_x()` 函数尽可能省略 move 构造函数?

我不知道为什么在最后一种情况下是在启用复制省略时调用move构造函数(甚至是强制性的,例如在C++17中):classX{public:X(inti){std::clogXmake_X(T&&arg){returnX(std::forward(arg));}intmain(){autox1=make_X(1);//1xconvertingctorinvokedautox2=X(X(1));//1xconvertingctorinvokedautox3=make_X(X(1));//1xconvertingand1xmovectorinvoked}在这种情况下,哪些规则会阻碍move构造

c++ - 使用 C++11 复制和 move 时避免代码重复

C++11“move”是一个不错的功能,但我发现当与“复制”同时使用时很难避免代码重复(我们都讨厌这个)。下面的代码是我实现的一个简单的循环队列(不完整),两个push()方法除了一行外几乎一样。我遇到过很多类似的情况。任何想法如何在不使用宏的情况下避免这种代码重复?===编辑===在这个特定示例中,可以将重复的代码重构出来并放入单独的函数中,但有时这种重构不可用或不容易实现。#include#includetemplateclassCircularQueue{public:CircularQueue(longsize=32):size{size}{buffer=std::malloc

c++ - 使用 C++11 复制和 move 时避免代码重复

C++11“move”是一个不错的功能,但我发现当与“复制”同时使用时很难避免代码重复(我们都讨厌这个)。下面的代码是我实现的一个简单的循环队列(不完整),两个push()方法除了一行外几乎一样。我遇到过很多类似的情况。任何想法如何在不使用宏的情况下避免这种代码重复?===编辑===在这个特定示例中,可以将重复的代码重构出来并放入单独的函数中,但有时这种重构不可用或不容易实现。#include#includetemplateclassCircularQueue{public:CircularQueue(longsize=32):size{size}{buffer=std::malloc

c++ - 我是否保证在 move vector 后指向 std::vector 元素的指针有效?

考虑这个例子:std::vectorv1={1,2,3};constint*i=&v1[1];std::vectorv2(std::move(v1));std::cout尽管在许多STL实现中这可能会起作用,但我是否保证在movestd::vector并且支持v2的内部缓冲区时不会执行重新分配和以前的v1一样吗?我无法在Internet和标准本身上找到此信息。 最佳答案 这是LWGopenissue2321[强调我的]Movingcontainersshould(usually)berequiredtopreserveiterato

c++ - 我是否保证在 move vector 后指向 std::vector 元素的指针有效?

考虑这个例子:std::vectorv1={1,2,3};constint*i=&v1[1];std::vectorv2(std::move(v1));std::cout尽管在许多STL实现中这可能会起作用,但我是否保证在movestd::vector并且支持v2的内部缓冲区时不会执行重新分配和以前的v1一样吗?我无法在Internet和标准本身上找到此信息。 最佳答案 这是LWGopenissue2321[强调我的]Movingcontainersshould(usually)berequiredtopreserveiterato

c++ - (缺少)使用 C++11 move 语义的性能改进

我已经编写C++11代码很长一段时间了,还没有对其进行任何基准测试,只期望像vector操作这样的东西现在可以通过move语义“更快”。因此,当实际使用GCC4.7.2和clang3.0(Ubuntu12.1064位的默认编译器)进行基准测试时,我得到了非常不满意的结果。这是我的测试代码:编辑:关于@DeadMG和@ronag发布的(好的)答案,我将元素类型从std::string更改了。至my::string没有swap(),并使所有内部字符串变大(200-700字节),这样它们就不会成为SSO的受害者。EDIT2:原因是奶牛。由伟大的评论再次改编代码,从std::string更改存