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

拉朱

我是C ++中r值和l值的新手。我在玩。我不确定为什么以下代码有效:

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;
}

编译器将引发以下错误:

candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument

我了解我们可以通过使用将l值转换为r值引用来使上述代码正常工作,std::move但不确定为什么我在文章开头共享的代码为何有效!

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

慈济

在此功能模板中:

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

T&&转发参考这意味着它可以绑定到l值或r值:

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

但是,这是一个正则函数,恰好采用r值:

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

因此只能使用r值来调用:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章