相关疑难解决方法(0)

标准库对自动分配的保证是什么?

C++ 11标准对标准库相关的自移动赋值有何看法?更具体的是,什么(如果有的话)保证什么selfAssign呢?

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}
Run Code Online (Sandbox Code Playgroud)

c++ stl move-semantics c++11

41
推荐指数
2
解决办法
3488
查看次数

标准库中自我赋值 - 不安全移动赋值运算符的基本原理是什么?

关于移动分配的标准库策略是允许实现假设永远不会发生自我分配 ; 在我看来这是一个非常糟糕的主意,因为:

  • C++中的"常规"("复制")转让合同一直被认为是安全的,不能自我分配; 现在我们还有另一个C++记忆和解释的不连贯的角落案例 - 以及一个微妙危险的案例; 我想我们都同意C++中需要的不是更隐藏的陷阱;
  • 它使算法复杂化 - remove_if家庭中的任何事情都需要照顾这个角落的情况;
  • 实现这个要求真的很容易 - 你用swap实现移动它是免费的,甚至在其他情况下(你可以通过ad-hoc逻辑获得一些性能提升)它只是一个,(几乎)从不采取分支,在任何CPU¹上几乎是免费的; 此外,在大多数有趣的情况下(涉及参数或本地的移动),优化器在内联时将完全删除分支(对于"简单"移动赋值运算符几乎总是会发生这种情况).

那么,为什么这样的决定呢?


¹特别是在库代码中,实现者可以自由地利用关于"分支预期结果"的编译器特定提示(在VC++ __builtin_expect中的gcc/__assume中).

c++ move-semantics c++11 move-assignment-operator

13
推荐指数
2
解决办法
953
查看次数

移动分配给自己的行为

示例代码:

#include <iostream>

int main()
{   
    std::vector<int> w(20, 123), x;
    w = std::move(w);
    std::cout << w.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.8.3上的输出: 0

当然,标准说移动赋值运算符使操作数处于未指定状态.例如,如果代码是x = std::move(w);那么我们期望w.size()为零.

但是,是否有指定的排序或其他条款涵盖自动案件?是否未指定大小是否为020其他内容或未定义的行为?标准容器在这里有任何定义的语义吗?

相关:此线程讨论您是否应该关心自己的类中的自动移动,但不讨论标准容器的移动赋值运算符是否执行,并且不提供标准引用.

NB.这与功能完全相同w = static_cast< std::vector<int> && >(w);std::move不同吗?

c++ move-semantics

8
推荐指数
1
解决办法
1689
查看次数

移动使用无效?

有人可以给我提示为什么这段代码没有输出任何东西?我假设它与移动线有关...

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int main(){ 
vector<int> v{66,79,154,24,76,13,7}; 

v = move(v); 
for(auto i: v) 
cout << i << " "; 
}
Run Code Online (Sandbox Code Playgroud)

更新:所以我添加了系统("暂停"); 帮助自己.我是否需要它并不是我所关注的.当我在Visual Studio 2013中再次运行代码时,它工作正常.但是,当我使用C++ 14运行Ideone时,它没有输出任何内容.现在有点困惑.

Visual Studio 2013 Ideone

c++ move vector visual-studio

6
推荐指数
1
解决办法
167
查看次数