关于`std::vector::push_back`声明的选择

About the choice of the declations of `std::vector::push_back`

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

我是C++的新手,想来想去还是想不通 idea.It 如果你能给我一些简单的例子就更好了 clear.I 会很高兴在这个问题上得到一些帮助。

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

void push_back (const value_type& val);

void push_back (value_type&& val);

Adds a new element at the end of the vector, after its current last element. The content of val is copied (or moved) to the new element.

Lvalues 不能绑定到右值引用,这意味着,当您使用左值参数调用 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"
}