第一个参数没有从 'A' 到 'A &&' 的已知转换
No known conversion from 'A' to 'A &&' for 1st argument
我不熟悉 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;
}
编译器抛出以下错误:
candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument
我知道我们可以使上面的代码工作,通过使用 std::move
将左值引用转换为右值引用,但不确定为什么我在 post 开头共享的代码是正在工作!
有人能告诉我我做错了什么吗?谢谢!
在此函数模板中:
template<typename T>
void printA(T&& b) {
std::cout<<"Print method called"<<std::endl;
}
T&&
是一个 forwarding reference。这意味着它可以绑定到左值或右值:
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
我不熟悉 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;
}
编译器抛出以下错误:
candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument
我知道我们可以使上面的代码工作,通过使用 std::move
将左值引用转换为右值引用,但不确定为什么我在 post 开头共享的代码是正在工作!
有人能告诉我我做错了什么吗?谢谢!
在此函数模板中:
template<typename T>
void printA(T&& b) {
std::cout<<"Print method called"<<std::endl;
}
T&&
是一个 forwarding reference。这意味着它可以绑定到左值或右值:
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