C++ 在pertect forward中获取值为“”的类型

C++ 在pertect forward中获取值为“”的类型,c++,typetraits,perfect-forwarding,C++,Typetraits,Perfect Forwarding,我创建了一个函数,该函数向前完善: 模板 无效推回3(T和容器){ 使用containter\u val\u type=typename T::value\u type; 集装箱箱型val=3; 集装箱。后装(val); } 该函数可以接受容器输入,例如std::vector,std::list 我知道上面的std容器具有机具类型traitvalue\u type 所以我只使用了std::vector::value\u type或std::list::value\u type 我将得到类型T

我创建了一个函数,该函数向前完善:

模板
无效推回3(T和容器){
使用containter\u val\u type=typename T::value\u type;
集装箱箱型val=3;
集装箱。后装(val);
}
该函数可以接受容器输入,例如
std::vector
std::list

我知道上面的
std
容器具有机具类型trait
value\u type

所以我只使用了
std::vector::value\u type
std::list::value\u type

我将得到类型
T

然后

I演示程序:

int main(int argc,char const*argv[]){
std::向量ivec{1,2,3,4};
向后推3(ivec);
for(std::vector::iterator iter=ivec.begin();
iter!=ivec.end();
++国际热核聚变实验堆(iter)
{

std::cout
T
被推断为左值引用,您必须通过以下方式删除引用:

typename std::decay_t<T>::value_type;
typename std::decage\u t::value\u type;
转发左值引用(这种情况下,因为
ivec
是命名对象)返回
T&
。无法获取引用类型的
value\u type


T
被推断为左值引用,您必须通过以下方式删除引用:

typename std::decay_t<T>::value_type;
typename std::decage\u t::value\u type;
转发左值引用(这种情况下,因为
ivec
是命名对象)返回
T&
。无法获取引用类型的
value\u type


完美的转发在这里没有意义,为什么还要费心向一个将在
}
死亡的容器中添加元素呢

取左值引用,则
T
是正确的类型

template<typename T>
void push_back_3(T& container) {
  using containter_val_type = typename T::value_type;
  containter_val_type val = 3;
  container.emplace_back(val);
}

完美的转发在这里没有意义,为什么还要费心向一个将在
}
消亡的容器中添加元素呢

取左值引用,则
T
是正确的类型

template<typename T>
void push_back_3(T& container) {
  using containter_val_type = typename T::value_type;
  containter_val_type val = 3;
  container.emplace_back(val);
}

Hi@rafix07确实
push_back_3(T&&container)
如果我使用
std::detacy_T
如果
T
被推断为右值引用,那么这个代码仍然可以正常工作吗?@curlywe为纯右值调用这个函数没有任何意义,因为您将更改向量的临时实例。当然,您可以通过右值引用调用
push_back3(std::move(ivec))
和modyfing vector,但这样做会产生误导。这里是与右值的链接,不要这样做。如果我使用
std::detaction\u T
如果
T
被推断为右值引用,那么Hi@rafix07是否可以
push\u back\u 3(T&&container)
仍然是零成本的?如果
T
被推断为右值引用,那么这个代码仍然可以正常工作吗?@curlywe为纯右值调用这个函数没有任何意义,因为您将更改向量的临时实例。当然,您可以通过右值引用调用
push_back3(std::move(ivec))
和modyfing vector,但这样做会产生误导。这里是与右值的链接,不要这样做。我想将容器传递到具有0成本的函数中。左值引用也是0成本的。您不需要
push_back_3
到一个右值容器中,并且在使用
container
时没有维护传入的值类别,因此,如果我将对象传递到可以修改的'push_back_3',则使用
lvalue reference
。如果我传递到
push_back_3
中的对象只是临时对象,请使用
rvalue reference
,对吗?
push_back_3
使用临时对象是没有意义的,因为根据定义,它将不再存在,以及它的所有元素。我希望将容器传递到具有0成本的函数中。值引用也是0成本的。您不需要
push_back_3
到一个右值容器中,并且在使用
container
时没有维护传入的值类别,因此,如果我将对象传递到可以修改的'push_back_3',则使用
lvalue reference
。如果我传递给
push_back_3
的对象只是临时对象,请使用
rvalue reference
,对吗?
push_back_3
使用临时对象是没有意义的,因为根据定义,临时对象及其所有元素都将不复存在。请注意,我们现在有for range:
for(int e:ivec){std::cout注意到我们现在有了for范围:
for(inte:ivec){std::cout