【发布时间】:2015-12-19 15:52:00
【问题描述】:
我有一个函数可以对两个向量进行排序,其中第一个向量作为排序标准。它的签名是
template<typename A, typename B>
void sort(A&& X, B&& Y)
{
..
}
问题是通用引用会允许像这样的无意义的情况
sort(vector<int>{ 2,1,3 }, vector<int>{ 3,1,2 });
其中一个右值将在之后被销毁(废话)。
明确要求左值不起作用,因为
template<typename A, typename B>
void sort(A& X, B& Y) ... // (*)
sort(vector<int>{2,1,3}, vector<int>{3,1,2});
出于某种原因,上述编译(我认为只有 const lvalues 被允许绑定到 rvalues 并延长它们的生命周期?)。
如果我将const 添加到左值引用,则该函数将不再能够修改向量并对其进行排序。
我的问题是:
1) 为什么在标有// (*) 的示例中我可以将右值绑定到甚至不是const 的左值?为什么不允许使用 int& r = 20; 之类的东西?有什么区别?
2) 如何解决我的问题,即让函数接受 only 左值而不接受右值临时值? (如果可能的话,当然)
显然我可以使用任何可用的 C++ 版本
【问题讨论】:
-
我怀疑 Visual Studio 编译器...
-
正如@BeyelerStudios 所暗示的,Visual Studio 编译器已经支持将临时对象绑定到非常量引用有一段时间了(不幸的是)。
-
但是,至少如果您使用足够高的警告级别,它确实会发出警告 - 您可能应该这样做
-
具体来说,MSVC 2013 将给出“mysourcefile.cpp(10): 警告 C4239: nonstandard extension used : 'argument' : conversion from '
' to ' ' 1 > 非 const 引用只能绑定到左值”,仅在警告级别 /W4 或更高级别。 -
@jaggedSpire 好资料
标签: c++ c++11 vector c++14 universal-reference