【发布时间】:2019-03-07 10:32:34
【问题描述】:
我的搜索发现很多关于右值绑定到左值的帖子,但没有类似的东西。如有重复请见谅。
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;
}
上面声明为auto的变量'name1'是一个左值。因此,“z”的初始化应该会失败,但它不会。
我在这里遗漏了什么吗?
【问题讨论】:
-
与手头的问题无关,但注意
name要初始化为name(std::move(s)),否则会出现拷贝。 -
@Angew:是的。谢谢指正。