C++ 将左值传递给用作临时std容器模板参数的通用引用参数时发生与分配器相关的错误
我已将我的用例简化为一个最小的无意义示例:C++ 将左值传递给用作临时std容器模板参数的通用引用参数时发生与分配器相关的错误,c++,c++11,allocator,forwarding-reference,C++,C++11,Allocator,Forwarding Reference,我已将我的用例简化为一个最小的无意义示例: #包括 模板 void f(容器&){//using&&给出编译错误…(*) std::向量{}; }; int main(){ std::向量v; f(v);//(*)…这是通过std::将v移到这里来“解决”的。为什么? } 它编译了。但是,当我添加另一个&以使未命名参数成为转发引用时,我得到以下错误(使用g++-std=c++11 thatfile.cpp或-std=c++17编译)。另一方面,呼叫站点上的std::moveingv解决了这个问
#包括
模板
void f(容器&){//using&&给出编译错误…(*)
std::向量{};
};
int main(){
std::向量v;
f(v);//(*)…这是通过std::将v移到这里来“解决”的。为什么?
}
它编译了。但是,当我添加另一个&
以使未命名参数成为转发引用时,我得到以下错误(使用g++-std=c++11 thatfile.cpp
或-std=c++17
编译)。另一方面,呼叫站点上的std::move
ingv
解决了这个问题
我想知道为什么
在/usr/include/c++/10.2.0/x86_64-pc-linux-gnu/bits/c++分配器中包含的文件中。h:33,
从/usr/include/c++/10.2.0/bits/allocator.h:46,
从/usr/include/c++/10.2.0/vector:64,
来自prova.cpp:1:
/usr/include/c++/10.2.0/ext/new_allocator.h:在“class\u gnu\u cxx::new_allocator”的实例化中:
/usr/include/c++/10.2.0/bits/allocator.h:116:11:必须来自“class std::allocator”
/usr/include/c++/10.2.0/bits/stl_vector.h:87:21:从“struct std::_vector_base”中需要
/usr/include/c++/10.2.0/bits/stl_vector.h:389:11:在“class std::vector”中是必需的
prova.cpp:5:5:从“void f(Container&)[with Container=std::vector&]开始需要”
prova.cpp:10:8:此处需要
/usr/include/c++/10.2.0/ext/new_allocator.h:62:26:错误:正在形成指向引用类型“std::vector&”的指针
62 | typedef _Tp*指针;
| ^~~~~~~
/usr/include/c++/10.2.0/ext/new_allocator.h:63:26:错误:正在形成指向引用类型“std::vector&”的指针
63 |类型定义常数*常数指针;
| ^~~~~~~~~~~~~
/usr/include/c++/10.2.0/ext/new_分配器。h:103:7:错误:形成指向引用类型“std::vector&”的指针
103 |分配(大小(类型)(n),常数无效*=静态(0))
| ^~~~~~~~
/usr/include/c++/10.2.0/ext/new_allocator.h:120:7:错误:正在形成指向引用类型“std::vector&”的指针
120 |解除分配(_-Tp*_-p,大小_-t)
| ^~~~~~~~~~
...
当您
template<typename Container>
void f(Container&) { // using && gives compilation error... (*)
std::vector<Container>{};
};
如果不使用std::move
,那么Container
将被推断为std::vector&
,这是一种引用类型,并且不能创建引用类型的向量,因此会出现错误
当您使用
std::move(v)
时,您将std::vector&&
传递给函数,因此容器
再次被推断为std::vector
,并且代码编译时它不是引用类型。太明显了!我现在觉得自己很愚蠢。我想我可以使用std::remove_reference
来修复它。@EnricoMariaDeAngelis您可以使用std::remove_reference
或者您也可以使用std::decay
<代码>衰退可以做更多的事情,但它可能是你想要的东西。
template<typename Container>
void f(Container&&) { // using && gives compilation error... (*)
std::vector<Container>{};
};