好吧,这可能看起来像一个愚蠢的问题,但它在这里:
template <typename T>
void foo(T& x)
{
}
int main()
{
foo(42);
// error in passing argument 1 of 'void foo(T&) [with T = int]'
}
Run Code Online (Sandbox Code Playgroud)
是什么阻止C++实例化实例化foo函数模板T = const int?
我有一个函数,它排序两个向量,其中第一个作为排序标准.它的签名是
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++版本