Dea*_*ean 4 c++ vector c++11 universal-reference c++14
我有一个函数,它排序两个向量,其中第一个作为排序标准.它的签名是
template<typename A, typename B>
void sort(A&& X, B&& Y)
{
..
}
Run Code Online (Sandbox Code Playgroud)
问题是普遍引用会允许无意义的案例
sort(vector<int>{ 2,1,3 }, vector<int>{ 3,1,2 });
Run Code Online (Sandbox Code Playgroud)
其后rvalue将被销毁(废话).
明确询问左值是不起作用的
template<typename A, typename B>
void sort(A& X, B& Y) ... // (*)
sort(vector<int>{2,1,3}, vector<int>{3,1,2});
Run Code Online (Sandbox Code Playgroud)
由于某种原因上面的编译(我认为只允许const值左右绑定到rvalues并延长它们的生命周期?).
如果我添加const到左值引用,那么该函数将不再能够修改向量并对它们进行排序.
我的问题是:
1)为什么在标有的示例中,// (*)我可以将rvalue绑定到不均匀的左值const?为什么int& r = 20;不允许这样的东西呢?有什么不同?
2)我如何解决我的问题,即函数只接受左值而不是右值临时值?(如果可能,当然)
显然我可以使用任何可用的C++版本
答案是:你的编译器错了.
检查gcc或clang或类似的,你会得到这样的东西:
prog.cpp:在函数'int main()'中:prog.cpp:9:45:错误:从'std :: vector'类型的右值排序'std :: vector&'类型的非const引用无效初始化(vector {2,1,3},vector {3,1,2}); ^ prog.cpp:6:6:注意:初始化'void sort(A&,B&)的参数1 [使用A = std :: vector; B = std :: vector]'void sort(A&X,B&Y){}
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |