关于`std::vector::push_back`声明的选择
About the choice of the declations of `std::vector::push_back`
std::vector::push_back
有两个声明。我在一定程度上理解rvalue
和lvalue
。据我所知,几乎所有类型(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"
}
std::vector::push_back
有两个声明。我在一定程度上理解rvalue
和lvalue
。据我所知,几乎所有类型(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"
}