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";
                ^~~~