Возвращаемое значение C ++ создано до или после автоматического уничтожения var?

В C ++ гарантированно ли создается возвращаемое значение до того, как автоматические переменные в функции будут уничтожены? Обратите внимание: Basket :: get:

class Basket
{
public:
  // Gift is a struct containing safely copyable things like int or string
  Gift gift;
  // Used to protect access and changes to gift
  Mutex mutex;

  // Copy gift into present, while locked to be thread safe
  void put (const Gift & gift)
  {
    Lock lock(mutex);   // Constructor locks, destructor unlocks mutex
    this->gift = gift;  // Gift assignment operator
  }

  // Return a memberwise-copy of gift, tries to be thread safe (but is it?)
  Gift get ()
  {
    Lock lock(mutex);  // Constructor locks, destructor unlocks mutex
    return gift;       // Gift copy constructor
  }
};

Мне нужно, чтобы Basket :: get выполняла конструктор копии Gift (возвращенного временного объекта) до разрушения объекта блокировки. В противном случае возвращаемый подарочный объект может быть поврежден одновременным вызовом функции put.

Мои тесты показывают, что подарочная копия действительно создается до разрушения блокировки, однако гарантируется ли это? Если нет, мне нужно создать второй временный объект внутри функции, например:

  Gift get ()
  {
    Gift result;
    {
      Lock lock(mutex);
      result = gift;
    }
    return result;
  }
19
задан maxpolk 8 December 2011 в 21:15
поделиться