我正在构建一个简单的{ mutex, value }
对,如下所示,如果我的用例定义明确,我想咨询c ++律师。
template<typename T, class mutex> class Locker;
template<typename T, class mutex>
class Mutexed
{
T _value;
mutex _mutex;
friend class Locker<T, mutex>;
public:
Mutexed() {}
Mutexed(const T& init) : _value(init) {}
Mutexed(const Mutexed<T>& other) : _value(other._value) {}
};
template<typename T, class mutex>
class Locker
{
Mutexed<T, mutex>& _mutexed;
public:
Locker(Mutexed<T, mutex>& mutexed) : _mutexed(mutexed) { _mutexed.mutex.lock(); }
~Locker() { _mutexed.mutex.unlock(); }
const T& operator*() const { return _mutexed.value; }
T& operator*() { return _mutexed.value; }
};
Mutexed<int, MyMutex> answer(42);
int getAnswer() { Locker<int> lock(answer); return *lock; }
由于*lock
, id est const T& operator*() const { return _mutexed.value; }
返回对answer._value
的引用,因此制作了从int&
到int
的副本。但是,因为lock
在返回时超出了范围:哪个副本和互斥锁将首先发生?
我的用例不是UB xor我需要写吗?
const int result = *lock;
return result;