c++ - 第一个参数没有从 'A' 到 'A &&' 的已知转换

标签 c++ templates rvalue lvalue stdmove

我对 C++ 中的右值和左值不熟悉。我正在玩它。我不确定为什么以下代码有效:

class A {
    public:
    A() {
        std::cout<<"Constructor called"<<std::endl;
    }
    A(const A& a) {
        std::cout<<"Copy Constructor called"<<std::endl;
    }
};

template<typename T>
void printA(T&& b) {
    std::cout<<"Print method called"<<std::endl;
}

int main() {
    // your code goes here
    A a;
    printA(a);
    return 0;
}

但是如果我将 printA 方法更改为以下内容,代码将无法编译:

void printA(A&& b) 以下是完整代码:

class A {
    public:
    A() {
        std::cout<<"Constructor called"<<std::endl;
    }
    A(const A& a) {
        std::cout<<"Copy Constructor called"<<std::endl;
    }
};

void printA(A&& b) {
    std::cout<<"Print method called"<<std::endl;
}

int main() {
    // your code goes here
    A a;
    printA(a);
    return 0;
}

编译器抛出以下错误:

候选函数不可行:第一个参数没有从“A”到“A &&”的已知转换

我知道我们可以通过使用 std::move 将左值转换为右值引用来使上述代码正常工作,但不确定为什么我在帖子开头共享的代码是工作!

有人可以告诉我我在这里做错了什么吗?谢谢!

最佳答案

在此函数模板中:

template<typename T>
void printA(T&& b) {
    std::cout<<"Print method called"<<std::endl;
}

T&&forwarding reference 。这意味着它可以绑定(bind)到左值或右值:

A a;
printA(a); // ok, l-value
printA(A{}); // ok, r-value

但是,这是一个常规函数,它完全接受右值:

void printA(A&& b) {
    std::cout<<"Print method called"<<std::endl;
}

因此只能使用右值调用:

A a;
printA(a); // error, can't bind r-value to l-value
printA(A{}); // ok, r-value

关于c++ - 第一个参数没有从 'A' 到 'A &&' 的已知转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61713109/

相关文章:

javascript - 如何更改自定义模板 JointJS 元素的 CSS?

c - 为什么 this 的结果不是左值?

C++ 只运行一段时间

c++ - Variadic constexpr 类型选择器

c++ - Gtkmm - "Gtk::DrawingArea"中的 "Gtk::ScrolledWindow"?

c++ - 如何实现decltype功能-C++ 11之前的编译时间

c++ - 如何处理模板代码中的数学常数

c++ - 混淆右值和左值

c++ - 什么时候调用右值析构函数/这样可以吗

c++ - 如何将类中的静态常量结构用作真正的常量 - 即数组大小