Есть ли способ кодировать ссылку только для записи на объект? Например, предположим, что существует класс мьютекса:
template <class T> class mutex {
protected:
T _data;
public:
mutex();
void lock(); //locks the mutex
void unlock(); //unlocks the mutex
T& data(); //returns a reference to the data, or throws an exception if lock is unowned
};
Есть ли способ гарантировать невозможность сделать это:
mutex<type> foo;
type& ref;
foo.lock();
foo.data().do_stuff();
ref = foo.data();
foo.unlock();
//I have a unguarded reference to foo now
С другой стороны, стоит ли оно того? Я знаю, что некоторые люди предполагают , что программисты не будут намеренно забивать систему, но тогда почему у нас в первую очередь закрытые переменные, а? Было бы неплохо просто сказать, что это «неопределенное поведение», но это кажется слишком небезопасным.
РЕДАКТИРОВАТЬ: ОК, я понимаю идею рутины сеттера, но как это будет сделано?
mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
foo.data().push_back(i);
}
foo.unlock ();
Для использования подпрограммы set потребуется копия для каждой записи:
mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
vector<int> copy = foo.read();
copy.push_back(i);
foo.write(copy);
}
хотя вы могли бы тривиально оптимизировать в этом конкретном случае, если, скажем, несколько различных потоков являются элементами выталкивания, и, возможно, даже стирают несколько, это может стать довольно избыточным копированием памяти (т. Е. По одному на критический раздел).