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

问题描述 投票:2回答:1

我的搜索发现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'的初始化应该失败,但事实并非如此。

我在这里错过了什么吗?

c++ auto rvalue lvalue
1个回答
4
投票

name1是一个左值...但它不是std::string,它是char const*。从中构造StrHolder涉及使用std::string中的隐式构造函数创建一个临时char const*,然后使用rvalue引用来调用StrHolder::StrHolder()name1独自离开,永远不会离开。

© www.soinside.com 2019 - 2024. All rights reserved.