将右值引用绑定到(自动生成的)左值
Bind rvalue reference to (auto generated) lvalue
我的搜索找到了很多关于右值绑定到左值的帖子,但没有发现任何类似的帖子。对不起,如果它是重复的。
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
涉及使用其来自 char const*
的隐式构造函数创建临时 std::string
,然后使用对该临时的右值引用调用 StrHolder::StrHolder()
。 name1
独自留下,永远不会离开。
我的搜索找到了很多关于右值绑定到左值的帖子,但没有发现任何类似的帖子。对不起,如果它是重复的。
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
涉及使用其来自 char const*
的隐式构造函数创建临时 std::string
,然后使用对该临时的右值引用调用 StrHolder::StrHolder()
。 name1
独自留下,永远不会离开。