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

Joh*_*ohn 2 c++ rvalue c++11

std::vector::push_back.I有两个声明,rvalue并且lvalue在某种程度上。据我所知,几乎所有类型(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 的内容被复制(或移动)到新元素。

Dan*_*ica 5

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

右值可以绑定到右值引用和常量左值引用。因此,两种重载都适用。但是根据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"
}
Run Code Online (Sandbox Code Playgroud)