相关疑难解决方法(0)

右值参考被视为左值?

我发布了这个答案:https://stackoverflow.com/a/28459180/2642059其中包含以下代码:

void foo(string&& bar){
    string* temp = &bar;

    cout << *temp << " @:" << temp << endl;
}
Run Code Online (Sandbox Code Playgroud)

bar左值还是左值?

我问,因为我显然不能取rvalue的地址,但我可以在这里完成rvalue引用的地址.

如果你可以对左值参考执行任何操作,你可以在左值参考上区分用"&&"而不仅仅是"&"来区分两者?

c++ rvalue lvalue rvalue-reference c++11

23
推荐指数
2
解决办法
3864
查看次数

为什么允许带有签名 void (X) 的 std::function 绑定到函数 void f(X&amp;&amp;)?

在下面的代码中,为什么std::function<void (X)>允许绑定到函数void f(X&&)

#include <functional>
struct X {};

void f1(X x) {}
void f2(X& x) {}
void f3(const X&) {}
void f4(X&& x) {}

int main()
{
    X x;
    
    f1(x);  // ok
    f2(x);  // ok
    f3(x);  // ok
//    f4(x);  // doesn't compile

    std::function<void (X)> ff1(f1);    // ok
    //std::function<void (X)> ff2(f2);  // doesn't compile
    std::function<void (X)> ff3(f3);    // ok
    std::function<void (X)> ff4(f4);    // ok... why?

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

演示

为什么允许这样做背后的直觉是std::function什么,它将如何由 实现,以及当您将左值参数传递给std::function,然后调用接受右值引用的函数时,这实际上意味着什么?

c++ std-function

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

在C++中使用移动语义的正确方法是什么?

考虑以下代码:

class A {
private:
    std::string data;
public:
    void set_data(std::string&& data) {
        this->data = std::move(data); // line 6
    }
};

int main() {
    std::string move_me = "Some string";
    A a;
    a.set_data(std::move(move_me)); // line 13
}
Run Code Online (Sandbox Code Playgroud)

我知道我们需要调用std::move()第13行,以便它向左值引用转换左值(这听起来是否正确?我是新手).

但是,在第6行,我们需要std::move()再次使用吗?我假设没有,因为我们已经传递了一个右值引用,并且std::string将调用移动构造函数.那是对的吗?

c++ stl move move-semantics

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