После публикации этого вопроса я попытался воспроизвести проблему случайного создания значения при создании объекта RAII с областями видимости.Теперь кажется, что я не могу воспроизвести его без ошибок компилятора!
В следующем примере кода в Test::foo()
второе создание ScopedLock не компилируется.Ошибка компилятора gcc кажется совершенно неверной.Может кто-нибудь объяснить?
struct Mutex
{
void lock() { }
void unlock() { }
};
struct ScopedLock
{
ScopedLock(Mutex & inMutex) : mMutex(inMutex)
{ mMutex.lock(); }
~ScopedLock()
{ mMutex.unlock(); }
private:
ScopedLock(const ScopedLock&);
ScopedLock& operator=(const ScopedLock&);
Mutex mMutex;
};
struct Test
{
void foo()
{
// Compiles fine
ScopedLock lock(mMutex);
// Error: no matching function for
// call to ‘ScopedLock::ScopedLock()’
ScopedLock(mMutex);
}
Mutex mMutex;
};
Я использую GCC 4.2.1 на Mac.
Обновление
Я посмотрел оригинальный код и увидел, что участникна него ссылались через указатель this
:
ScopedLock(this->mMutex); // short-lived temporary and compiles fine