C++ 只读变量不可赋值c++;模板函数

C++ 只读变量不可赋值c++;模板函数,c++,template-function,C++,Template Function,我正在尝试编写自己的模板交换函数,但此代码有问题: template <class T> void swap_universal(T &a, T &b) { T tmp = a; a = b; b = tmp; } 如您所见,在quick_Sort函数中调用了新的swap函数我认为不必查看调用站点,我们就可以推断出发生了什么 临时值不能绑定到可变的l值引用。它可以绑定到可变r值引用或常量引用 因此,在调用函数时,这是一个无法编译的示例: ex

我正在尝试编写自己的模板交换函数,但此代码有问题:

template <class T>
void swap_universal(T &a, T &b) {
    T tmp = a;
    a = b;
    b = tmp;
}

如您所见,在
quick_Sort
函数中调用了新的swap函数

我认为不必查看调用站点,我们就可以推断出发生了什么

临时值不能绑定到可变的l值引用。它可以绑定到可变r值引用或常量引用

因此,在调用函数时,这是一个无法编译的示例:

extern Foo make_a_new_foo();
Foo f;
swap_universal(f, make_a_new_foo());
常量引用对您没有好处,因为您希望修改引用对象。所以您真正想要的是一个模板函数,它根据上下文推断a和b是r值引用还是l值引用

幸亏C++在推导上下文中指定了R值引用语法(在这种情况下,T是在推导上下文中进行评估的,因为它的类型依赖于为T选择正确的类型)来处理此魔术。

这将有助于:

template <class T, class U, typename = std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value>>
void swap_universal(T &&a, U &&b) {
    T tmp = a;
    a = b;
    b = tmp;
}
模板
无效交换(T&a、U&b){
T tmp=a;
a=b;
b=tmp;
}

您如何称呼此功能?请编辑您的问题,将其包含在内。还包括实际的、完整的和未编辑的错误输出。您使用常量对象作为参数调用函数
std::swap
有什么问题吗?向量
mas
是对常量向量的引用,您不能修改它。在参数声明中删除
const
关键字。这个答案相当误导。代码带有
Foo
,但出于不同的原因,OP声称:
const
在这种情况下永远无法推导。而且转发引用案例实际上不使用转发,因此对于仅移动类型,它会以相当神秘的方式失败。@Angew您链接的示例与我的答案不匹配。那么,我误解了您的答案。我认为它是“(a)这是OP代码会显示OP错误的代码,以及(b)这是如何解决它的。”但您显示的第一个代码不会显示OP错误。首先,感谢您就此开始对话。因此,我发现我的第一个解决方案存在问题(已修复)。经过深思熟虑,我接受你的立场。我对OP的特定用例的假设是不正确的。话虽如此,我还是给出了答案,因为在我看来,(修改后的)交换函数很可能接近OP想要的。(即对r值和l值参考都有效的掉期)这似乎不太可能是解释;这将给出绑定失败的错误,而不是
const
问题
template <class T, class U, typename = std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value>>
void swap_universal(T &&a, U &&b) {
    T tmp = a;
    a = b;
    b = tmp;
}