将右值引用绑定到(自动生成的)左值

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 独自留下,永远不会离开。