小编ano*_*ous的帖子

为什么我们不能移动迭代器?

C++ 11引入了一种"移动"算法,其行为类似于"复制"算法,除了它......移动数据而不是复制它.我想知道为什么委员会没有更新复制算法以使用向前(或者可能除此之外).

向量提供了T&A的迭代器.常量const向量提供了const T的迭代器.有一个原因导致向量&&无法提供T &&的迭代器吗?这将允许使用vector的构造函数将元素从列表移动到向量...

这是个坏主意吗?

c++ move-semantics c++11

7
推荐指数
2
解决办法
1140
查看次数

为什么不能移动这些变量?

在C++移动语义中似乎有很多错失的机会.我想了解这些背后的基本原理以及为什么标准在定义何时应该在以下情况下移动变量时更积极:

string f()
{
    string s;
    return s + " ";
}
Run Code Online (Sandbox Code Playgroud)

operator+(const string&, const char*)不是operator+(string&&, const char*),我相信,因为这s是一个左值.难道标准不能说,在函数中最后一次使用局部变量时,变量是否可以被认为是可移动的?

我认为有一个类似的例子:

struct A { A(string&&); };
string g()
{
    string s;
    return s; // s is moved
}
A h()
{
    string s;
    return s; // s can't be moved!
}
Run Code Online (Sandbox Code Playgroud)

g使用移动语义将数据移动s到返回值,但h由于s未移入,因此不会编译h.我相信这是因为标准有一个特殊的情况g,它基本上说,如果你返回一个与返回类型完全相同类型的局部变量,则移动变量.为什么不是规则,如果你返回一个局部变量,它被移动,不管它的类型是什么?

c++ move-semantics c++11

4
推荐指数
2
解决办法
169
查看次数

使用模板移动运算符

我有一个模板化的课程,我想避免复制(因为这样做的潜在成本).我可以实现一个移动构造函数,但我还想允许移动"accross template parameter".这是我正在尝试编译的内容:

template <class T>
class Foo
{
public:
    Foo() {}
    template <class U> Foo(Foo<U>&&) {}

private:
    Foo(const Foo&);
};

Foo<int> f() { Foo<float> y; return move(y); }
Foo<int> g() { Foo<int> x; return x; }
Foo<int> h() { Foo<float> z; return z; }
Run Code Online (Sandbox Code Playgroud)

我理解为什么在技术上f编译:move(y)的类型是Foo(float)&&并且碰巧有一个方便的构造函数接受Foo(U)&&,因此编译器设法找到U = float工作.

h不编译.z的类型为Foo(float),我猜这距离Foo(U)&&太远,以确定如果选择U = float,则可以调用移动构造函数...

我不确定为什么g编译,但确实如此.x的类型是Foo(int).编译器如何设法使用move运算符(它不能只是从Foo(int)隐式转换为Foo(int)&&,可以吗?)

所以我的问题是:规则是什么?为什么h编译但g不?有什么我可以在Foo中改变以使h编译?

谢谢

c++ templates move-semantics c++11

3
推荐指数
1
解决办法
2279
查看次数

C++ 中良性竞争条件的保证

我知道 C++ 标准不能保证存在数据争用的任何情况(我相信数据争用具有未定义的行为,这意味着任何事情都会发生,包括程序终止、修改随机内存等...)。

是否有任何架构,其中由一个线程写入内存位置和一个线程从同一位置读取(不同步)组成的数据竞争不会导致读取操作读取未定义的值,并且内存位置“最终”(在内存屏障之后)更新为写入操作写入的值?

[编辑以将“竞争条件”替换为“数据竞争”]

c++ multithreading race-condition

3
推荐指数
1
解决办法
1720
查看次数