В VS2013 обновлении 5 у меня есть это:
class Lock
{
public:
Lock(CriticalSection& cs) : cs_(cs)
{}
Lock(const Lock&) = delete;
Lock(Lock&&) = delete;
Lock& operator=(const Lock&) = delete;
Lock& operator=(Lock&&) = delete;
~Lock()
{
LeaveCriticalSection(&(cs_.cs_));
}
private:
CriticalSection& cs_;
};
class CriticalSection
{
CRITICAL_SECTION cs_;
public:
CriticalSection(const CriticalSection&) = delete;
CriticalSection& operator=(const CriticalSection&) = delete;
CriticalSection(CriticalSection&&) = delete;
CriticalSection& operator=(CriticalSection&&) = delete;
CriticalSection()
{
InitializeCriticalSection(&cs_);
}
~CriticalSection()
{
DeleteCriticalSection(&cs_);
}
// Usage: auto lock = criticalSection.MakeLock();
Lock MakeLock()
{
EnterCriticalSection(&cs_);
return Lock(*this);
}
}
MakeLock
возвращает экземпляр недвижного, не копируемого типа. И это, похоже, работает нормально. Но Visual Studio intellisense подчеркивает возврат в красный цвет с предупреждением о невозможности ссылки на конструктор блокировки перемещения, поскольку это удаленная функция.
Я пытаюсь понять, почему это работает, и если оно стандартно соответствует С++ или просто что-то своеобразное для MSVC. Я думаю, что возвращение работает, потому что необходимость в построении возвращаемого значения может быть оптимизирована, поэтому предупреждение intellisense предупреждает о чем-то, что на самом деле - на самом деле не происходит.
Я думаю, что я где-то читал, что С++ будет стандартизировать, гарантируя, что оптимизация возвращаемого значения всегда будет выполняться.
Итак, соответствует ли этот код С++ и будет ли он работать в будущих компиляторах?
P.S. Я понимаю, что std::mutex
и std::lock_guard
могут заменить это.