Const метод, возвращающий неконстантную ссылку на векторный элемент

Мне трудно понять, как вернуть non-const ссылка на элемент в std::vector из метода константного класса. Простой пример того, что я собираюсь сделать, это

template<class T>
class MyClass
{
public:
MyClass : myVec(3)
{
}

T& x() const
{
return *(myVec.data())[0]
}

std::vector<T> myVec;
}

Поведение, за которое я иду, это то, что я хотел бы иметь возможность делать такие вещи, как следующие,

MyClass obj<double>;
obj.x() = 3.3;
assert(obj.x()==3.3)

собственный дает тот же тип поведения, но я не смог понять, как заставить его работать.

2

Решение

Вы могли бы использовать const_cast, и он будет работать здесь (в соответствии с опубликованным использованием). Но вам это не понадобится для этого случая (и для большинства случаев).

Вы можете (и должны) добавить неконстантную перегрузку функции-члена для него. Затем функция-член const возвращает ссылку на const, функция-неконстантная функция возвращает ссылку на не-const. Соответствующий будет вызван через разрешение перегрузки.

const T& x() const
{
return myVec[0];
}
T& x()
{
return myVec[0];
}
10

Другие решения

Контейнеры стандартной библиотеки расширяют константу контейнера до самих значений. Так как ваш класс постоянен в x()так же вектор. Вы могли бы использовать const_cast удалить const от предмета в вашем аксессоре.

return const_cast <T&> (*(myVec.data())[0]);

В целом это считается плохой практикой, так как const там, чтобы защитить вас. Обход этой защиты может усложнить работу кода.

2