只读变量不是可分配的c ++模板函数

时间:2015-10-26 09:13:30

标签: c++ template-function

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

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

在这两行:a = bb = tmp我收到错误read only variable is not assignable。我正在使用Xcode。

UPD:这是完整的代码:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>

using namespace std;

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

template <typename T>
void quick_Sort(const int &start, const int &end, const vector<T> &mas/*, const vector<T> arr*/) {
    int left = start, right = end;
    int middle = rand() % (end - start) + start;
    while (left < right) {
        while (mas[left] < middle)
        left++;
        while (mas[right] > middle)
            right--;
        if (left <= right) {
            swap_universal(mas[left], mas[right]);
            left++;
            right--;
        }
    }
    if (start < right)
        quick_Sort(start, right, mas);
    if (end > left)
        quick_Sort(left, end, mas);
}

int main(int argc, const char * argv[]) {
    vector<int> t;
    for (int i = 100; i >= 0; i--) {
        t.push_back(i);
    }
    quick_Sort(0, t.size() - 1, t);
}

如您所见,在quick_Sort函数

中调用了新的交换函数

1 个答案:

答案 0 :(得分:0)

我认为,如果没有看到呼叫网站,我们可以推断出发生了什么。

临时无法绑定到可变的l值引用。它可以绑定到可变的r值引用或const引用。

所以在调用你的函数时,这是一个无法编译的例子:

extern Foo make_a_new_foo();
Foo f;
swap_universal(f, make_a_new_foo());

const引用对你没有好处,因为你想修改引用对象。所以你真正想要的是一个模板函数,它推断出a和b是r值引用或l值引用,具体取决于上下文。

幸运的是,当您在推导的上下文中指定r值引用语法时,c ++会为您处理这种魔法(在这种情况下,T在推导的上下文中进行评估,因为它的类型取决于为T选择正确的类型)。 p>

这将有效:

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;
}