Разница между rvalue и lvalue

278
10 марта 2018, 19:44

Имеется небольшой шаблон функции, который пиинимает в качестве аргументов две ссылки на переменные одинакового типа и меняет их значения местами. При этом когда передаю в функцию два члена вектора типа int, то все работает. Но если vectot<bool>, то нужно перегрузить функцию и вместо

template<typename T>
void fun (T & a, T & b)
{
    T temp = a;
    a = b;
    b = temp;
    return;
}

Написать

template<typename T>
void fun (T && a, T && b)
{
    T temp = a;
    a = b;
    b = temp;
    return;
}

Почему так?

Answer 1

Спецификация языка С++ позволяет реализовать std::vector<bool> не как обычный вектор из значений bool, а как специализированный упакованный битовый массив, в котором каждое булевское значение хранится в одном бите. Так как в С++ невозможно создать ссылку на отдельный бит, те методы вектора, которые обычно возвращают ссылку на его элемент (например, operator []), в случае std::vector<bool> возвращают не ссылку bool &, а специальный временный прокси-объект. Этот прокси-объект и реализует чтение и запись отдельного бита.

Т.е. запросто может получиться так, std::vector<bool>::reference - это совсем не ссылочный тип bool &, а некий определяемый реализацией класс-тип, реализующий/симулирующий поведение обобщенной ссылки. Так как возвращаемый объект этого типа является временным, его невозможно никуда передать по неконстантной lvalue-ссылке. А по rvalue-ссылке - можно.

Это, в частности, означает, что std::vector<bool> не обязательно соответствует требованиям, накладываемым на стандартный контейнер.

READ ALSO
Как присоединиться к SqlServer программно

Как присоединиться к SqlServer программно

Есть программа на C#, необходимо переписать код на C++В итоге мучаюсь с тем, что не могу подключиться к БД

206
Класс Матрица С++

Класс Матрица С++

Только начинаю изучать ООП, написал класс для матриц и перегрузил операторы ввода, вывода, +, -, =Программа работает до момента с сложением...

221
vector subscript out of range c чем это связано?

vector subscript out of range c чем это связано?

Ребят помогите с чем связана такая ошибка? Почему выходит за рэнджЗаметил во многих программах моих появляется когда использую большие числа

225
Функция как параметр для другой функции

Функция как параметр для другой функции

Требуется вызвать функции с различными типами данных (void, double, int) в другой функцииПример: Есть функции:

232