我是 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-value 转换为 r-value 引用来使上述代码工作,std::move
但不知道为什么我在帖子开头分享的代码工作正常!
有人可以告诉我我在这里做错了什么吗?谢谢!