相关疑难解决方法(0)

为什么`std :: move`命名为`std :: move`?

C++ 11 std::move(x)函数根本不会移动任何东西.它只是一个转换为r值.为什么这样做?这不是误导吗?

c++ c++-faq rvalue-reference move-semantics c++11

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

范围结束时的左值是否可以视为右值?

编辑:考虑以下两个例子:

std::string x;
{
    std::string y = "extremely long text ...";
    ...
    x = y; // *** (1)
}
do_something_with(x);
Run Code Online (Sandbox Code Playgroud)
struct Y
{
    Y();
    Y(const Y&);
    Y(Y&&);
    ... // many "heavy" members
};

struct X
{
    X(Y y) : y_(std::move(y)) { }
    Y y_;
}

X foo()
{
    Y y;
    ...
    return y; // *** (2)
}
Run Code Online (Sandbox Code Playgroud)

y在线(1)和(2)的两个例子中,它的寿命接近结束并且即将被破坏.很明显,它可以被视为右值并在两种情况下都可以移动.在(1)中,它的内容可以移入x和移入(2)到temp的实例中X().y_.

我的问题是:

1)是否会在上述任何一个示例中移动?(a)如果是,则采用何种标准规定.(b)如果不是,为什么不呢?这是标准中的遗漏还是我没有想到的另一个原因?

2)如果上述答案为否.在第一个例子中,我可以改变(1)x = std::move(y)以强制编译器执行移动.在第二个示例中,我可以做什么来向编译器指示y可以移动?return std::move(y)

注意:我故意返回(2)中的实例Y而不是X …

c++ lvalue-to-rvalue c++14

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