相关疑难解决方法(0)

移动物体怎么办?

标准是否准确定义了对象移动后我可以对其做什么?我曾经认为你用移动物体做的所有事情都可以破坏它,但这还不够.

例如,采用swap标准库中定义的函数模板:

template <typename T>
void swap(T& a, T& b)
{
    T c = std::move(a); // line 1
    a = std::move(b);   // line 2: assignment to moved-from object!
    b = std::move(c);   // line 3: assignment to moved-from object!
}
Run Code Online (Sandbox Code Playgroud)

显然,必须可以分配给移动的对象,否则第2行和第3行将失败.那么移动对象我还能做些什么呢?我在哪里可以找到标准中的这些细节?

(顺便说一句,为什么它T c = std::move(a);不是T c(std::move(a));第1行呢?)

c++ swap variable-assignment move-semantics c++11

136
推荐指数
2
解决办法
1万
查看次数

使用unique_ptr复制类的构造函数

如何为具有unique_ptr成员变量的类实现复制构造函数?我只考虑C++ 11.

c++ unique-ptr c++11

89
推荐指数
5
解决办法
7万
查看次数

我可以从std :: vector中std :: move()一个元素吗?

我有一个std::vector<std::string>要在循环中重复使用.它是确定std::move的元素呢?如果我将第i个元素移出,那么ith 插槽将进入一个未定义但有效的状态,但是矢量呢?它的状态是否仍然有效且有效?另外,我可以clear()在下一次迭代中重复使用向量吗?

编辑:请在标记复制之前阅读问题.我问的是v2做完后的状态std::move(v2[0]),不是std::move(v2).v2我也做了之后再重复使用v2.clear().这与建议的重复有什么相似之处?

编辑:代码示例:

struct Foo {
    string data;
    /* other data memebers */
    void workOnData();
}

std::vector<std::string> buffer;
Foo foo;
while (1) {
    buffer.clear();
    loadData(buffer); // push data to buffer, at least one element in buffer guaranteed
    foo.data.assing(std::move(buffer[0])); // please don't ask is Foo necessary or why workOnData has to be a member method. THIS IS A SIMPLIFIED EXAMPLE!
    foo.workOnData();
}
Run Code Online (Sandbox Code Playgroud)

c++ c++11

18
推荐指数
1
解决办法
4764
查看次数

如果我将一个本地对象移动到一个函数中,它之后是否仍然有效?

所以,这提供了预期的输出:

void f(std::string&& s)
{
   s += " plus extra";
}

int main(void)
{
   std::string str = "A string";
   f( std::move(str) );
   std::cout << str << std::endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

字符串加上额外的

也就是说,当我在Ideone上运行它时,它可以工作,但它是UB吗?在调用之前和之后添加额外的字符串初始化f没有改变任何东西.

c++ move-semantics c++11

16
推荐指数
3
解决办法
887
查看次数

std ::在堆栈对象上移动

我知道这是一个非常基本的,甚至可能是令人尴尬的问题,但我无法理解这一点.如果我std ::从堆栈上的东西移动到另一个对象,当原始文件超出范围时,是否还可以使用另一个对象?

#include <iostream>
#include <string>

int
main(int argc, char* argv[])
{
    std::string outer_scope;

    {
        std::string inner_scope = "candy";
        outer_scope = std::move(inner_scope);
    }

    std::cout << outer_scope << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我尝试打印时,outer_scope仍然有效吗?

c++ move-semantics c++11

7
推荐指数
1
解决办法
1678
查看次数

C ++:有效但未指定状态。这是什么意思?

我一直在试图了解std :: move。这个文档很好地描述了它。但是它在示例部分中说:“ .....当bar失去其值,现在处于有效但未指定的状态.....”。许多其他文档也在相同的上下文中使用此术语。另外,我在与之相关的stackoverflow上找到了很多答案。是完全相同的问题。但是它没有谈论“未指定的含义是什么?”。

所以我的问题是?

有效但未指定的含义是什么?

它对指针变量(ClassA* ptr)有什么影响?

对变量所指向的对象有什么影响?

谢谢。

c++ move

5
推荐指数
0
解决办法
322
查看次数