我的搜索发现rvalue上绑定到左值的很多帖子,但没有类似的东西。对不起,如果它是重复的。
struct StrHolder {
StrHolder(std::string&& s) : name(s) {}
void Print() const { std::cout << "My name is " << name << std::endl; }
std::string name;
};
int main()
{
StrHolder s{"Tom"}; // (1) - OK, as expected
s.Print();
std::string n1 {"Angi"};
StrHolder p{std::move(n1)}; // (2) - OK, also as expected
p.Print();
//StrHolder q{n1}; // (3) - NOT OK. Also expected. Cannot bind rvalue reference to lvalue
//q.Print();
auto name1 {"Bon"}; // name1 is an lvalue
StrHolder z{name1}; // (4) - Why is this OK ?
z.Print();
return 0;
}
变量'name1'声明为auto,上面是左值。因此,'z'的初始化应该失败,但事实并非如此。
我在这里错过了什么吗?
name1
是一个左值...但它不是std::string
,它是char const*
。从中构造StrHolder
涉及使用std::string
中的隐式构造函数创建一个临时char const*
,然后使用rvalue引用来调用StrHolder::StrHolder()
。 name1
独自离开,永远不会离开。