常量左值参考我最近一直在寻找到转发引用C++和下面是我目前的概念的理解一个简单的总结。转发参考VS模板代码
比方说,我有一个模板功能foo
采取的转发参考T
类型的一个参数。
template<typename T>
void foo(T&& arg);
如果我把这种功能与左值然后T
将推导出T&
使arg
参数是T&
类型的由于参考塌陷规则T& && -> T&
。
如果该函数获得与无名暂时的,称为诸如函数调用的结果,然后T
将推导出T
使arg
参数是T&&
类型。
Inside foo
然而,arg
是一个命名参数,因此如果我想将参数传递给其他函数并仍然保持其值类别,则需要使用std::forward
。
template<typename T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
据我了解,cv-qualifiers不受此转发影响。这意味着,如果我调用foo与命名常量变量然后T
将推导出const T&
以及因此arg
类型也将是const T&
由于参考塌陷规则。为常量右值T
将推导出const T
因此arg
将const T&&
类型。
这也意味着如果我在foo
中修改arg
的值,如果我确实通过一个const变量传递给它,那么我将得到一个编译时错误。
现在到我的问题。 假设我正在编写一个容器类,并且想要提供一个将对象插入到我的容器中的方法。
template<typename T>
class Container
{
public:
void insert(T&& obj) { storage[size++] = std::forward<T>(obj); }
private:
T *storage;
std::size_t size;
/* ... */
};
通过使insert
成员函数采取的转发参考obj
我可以使用std::forward
如果insert
是INFACT传递一个临时对象取所存储的类型T
的移动赋值操作的优点。
以前,当我不知道任何关于转发引用时,我会写这个成员函数采用一个常量左值引用: void insert(const T& obj)
。
这样做的缺点是,如果insert
传递临时对象,则此代码不利用(假设更有效)移动赋值运算符。
假设我没有错过任何东西。
是否有任何理由,提供两个重载插入功能?一个采取常数左值参考,另一个参考转发参考。
void insert(const T& obj);
void insert(T&& obj);
我问的原因是the reference documentation for std::vector
指出push_back
方法有两种重载。
void push_back (const value_type& val);
void push_back (value_type&& val);
为什么第一个版本(采取const value_type&
)需要的?
'insert(T && obj)'不是转发引用。它由班级固定。 – Jarod42