【问题标题】:About the choice of the declations of `std::vector::push_back`关于 `std::vector::push_back` 的声明的选择
【发布时间】:2020-06-05 05:46:44
【问题描述】:

std::vector::push_back 有两个声明。我在某种程度上理解 rvaluelvalue。据我所知,几乎所有类型(T&、T&&、T)都可以转换为const T&,那么当不同类型的对象传递给std::vector::push时编译器会选择哪一个呢?

我是 C++ 的新手。虽然我想了一遍又一遍,但我仍然无法理解。如果你能给我一些简单的例子来说明清楚就更好了。我会很高兴能得到一些帮助带着这个问题。

根据文档(http://www.cplusplus.com/reference/vector/vector/push_back/),它说:

void push_back(const value_type& val);

void push_back(value_type&& val);

在向量的末尾添加一个新元素,在其当前元素之后 最后一个元素。 val 的内容被复制(或移动)到新的 元素。

【问题讨论】:

    标签: c++ c++11 rvalue


    【解决方案1】:

    左值不能绑定到右值引用,这意味着当您使用左值参数调用 std::vector<T>::push_back 时,唯一可行的重载是使用 const T&参数。

    Rvalues 可以绑定到右值引用和 const 左值引用。因此,两种重载都适用。但是根据C++重载规则,会选择右值引用参数T&&的重载。


    您可以自己轻松尝试:

    void f(const int&) { std::cout << "L"; }
    void f(int&&) { std::cout << "R"; }
    
    int main() 
    {
       int i = 0;
       f(i);  // prints "L"
       f(0);  // prints "R"
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 2013-10-15
      • 2021-06-18
      • 2023-03-21
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多