函数只接受非常量左值

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++版本

Bey*_*ios 7

答案是:你的编译器错了.

检查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){}