相关疑难解决方法(0)

从rvalue参数中推导出对const的引用

好吧,这可能看起来像一个愚蠢的问题,但它在这里:

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

c++ templates const reference instantiation

10
推荐指数
1
解决办法
334
查看次数

函数只接受非常量左值

我有一个函数,它排序两个向量,其中第一个作为排序标准.它的签名是

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

c++ vector c++11 universal-reference c++14

4
推荐指数
1
解决办法
518
查看次数