C++ Can';t传递左值以构造右值
是否有人可以帮助解释为什么在我下面的示例中,C++ Can';t传递左值以构造右值,c++,C++,是否有人可以帮助解释为什么在我下面的示例中,UseString不能接受左值作为参数?我知道在我的例子中创建了一个临时的字符串,但我无法解释为什么它必须在这里接受右值 #include <utility> using namespace std; struct String { String(const char* cstr) { } }; struct UseString { UseString(const String& str)
UseString
不能接受左值作为参数?我知道在我的例子中创建了一个临时的字符串
,但我无法解释为什么它必须在这里接受右值
#include <utility>
using namespace std;
struct String
{
String(const char* cstr)
{
}
};
struct UseString
{
UseString(const String& str)
{
}
};
int main()
{
const char* cstr = "abc";
UseString(std::move(cstr)); //Correct
UseString("abc"); // Correct
UseString(cstr); // Error but why UseString cannot accept lvalue as parameter in this case?
return 0;
}
#包括
使用名称空间std;
结构字符串
{
字符串(常量字符*cstr)
{
}
};
结构UseString
{
UseString(常量字符串和str)
{
}
};
int main()
{
常量字符*cstr=“abc”;
UseString(std::move(cstr));//正确
UseString(“abc”);//正确
UseString(cstr);//错误,但在这种情况下为什么UseString不能接受左值作为参数?
返回0;
}
问题是因为使用字符串(cstr)代码>不做您认为它做的事情
它实际上是一个变量声明,而不是构造函数调用。其处理方式与UseString cstr完全相同代码>和cstr
已在前面声明,因此出现错误
看
根据这一点:
问题是因为使用字符串(cstr)代码>不做您认为它做的事情
它实际上是一个变量声明,而不是构造函数调用。其处理方式与UseString cstr完全相同代码>和cstr
已在前面声明,因此出现错误
看
根据这一点:
符号和运算符将其带到struct UseString中str的地址,并且变量没有声明地址,因此不考虑左值。您认为UseString(“abc”)如何代码>是吗?嗯,对g++的抱怨是非常直接和精确的。(我必须承认,我以前没有看到过这个问题。)有点恼火的解析再次出现了。“abc”
是一个左值,顺便提一下。符号运算符将它带到struct UseString中str的地址,变量没有声明地址,因此不考虑左值。您认为UseString(“abc”)是什么代码>是吗?嗯,对g++的抱怨是非常直接和精确的。(我必须承认,我以前没有看到过这个问题。)稍微有点恼火的解析再次出现。“abc”
是一个左值
@Nick right,因为它不能被混淆为变量声明这里是另一个工作示例UseString(String{cstr})代码>@Nick right,因为它不能作为变量声明混淆
prog.cpp: In function ‘int main()’:
prog.cpp:24:16: error: conflicting declaration ‘UseString cstr’
UseString(cstr);
^
prog.cpp:21:14: note: previous declaration as ‘const char* cstr’
const char* cstr = "abc";
^~~~