Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将左值传递给用作临时std容器模板参数的通用引用参数时发生与分配器相关的错误_C++_C++11_Allocator_Forwarding Reference - Fatal编程技术网

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
ing
v
解决了这个问题

我想知道为什么

在/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>{};
};