代码之家  ›  专栏  ›  技术社区  ›  LeastSquaresWonderer

为什么通用引用和右值引用的流程不同

  •  4
  • LeastSquaresWonderer  · 技术社区  · 6 年前

    使用高效的现代C++,第25项。我们有一个例子

    案例1

    class Widget {
    public:
    template<typename T>
    void setName(T&& newName)
    { name = std::forward<T>(newName); }
    ...
    };
    

    案例2

    class Widget {
    public:
    void setName(const std::string& newName)
    { name = newName; }
    void setName(std::string&& newName)
    { name = std::move(newName); }
    ...
    };
    

    电话

    Widget w;
    w.setName("Adela Novak");
    

    现在假设情况1,本书声明文字将传递给w的name数据成员中的t std::string的赋值运算符。

    假设案例2,本书指出->首先,从文本创建一个临时对象,调用字符串构造函数,以便setName参数可以绑定到它,然后将该临时对象移动到w的name数据成员中。

    问题

    为什么会出现这种行为上的差异?我该怎么想呢?

    也就是说,为什么在案例1中不需要临时的?为什么会有差异?是T&&不推断为字符串的右值引用,从而得出与案例2相同的行为(根据本书,显然不是,但为什么)?

    1 回复  |  直到 6 年前
        1
  •  9
  •   François Andrieux    6 年前

    在案例1中, T 推断为 const char (&)[12] std::string . 编译器没有理由将字符串文字升级为 标准::字符串 然而在案例2中,每个重载都需要引用 标准::字符串 ,强制创建临时 标准::字符串 可以使用隐式 const char* 构造函数。

    请注意,当右值引用 std::string && 只能绑定到右值,即模板化的等效值 T && 可以绑定到右值和左值。