Функция «id» в C ++ 0x

Чтение этого ответа относительно возврата ссылок rvalue из функции заставило меня задуматься, как мне написать id в C ++ 0x.

По сути, я хочу, чтобы id была функцией, которая ничего не делает, функцией, которая не оказывает заметного воздействия на программу.

Моя первая попытка заключается в следующем:

#include 

class X
{
public:
  X(std::string&& s) : s(std::move(s)) {};
  X(const std::string& s) : s(s) {};
  std::string s;
  ~X() { std::cout << "Destroying: " << s << std::endl; }
private:
  X(const X&) {};
  X(X&&) {};
};

template 
T&& id(T&& x) { return static_cast(x); }

int main()
{
  auto&& x1 = X("x1");
  std::cout << "Line 1" << std::endl;
  auto&& x2 = id(X("x2"));
  std::cout << "Line 2" << std::endl;
}

Однако я боюсь, что в данном случае x2 - это висячая ссылка, поскольку X ("x2") уничтожается перед выполнением "Line 2".

Итак, здесь совершенно очевидно, что id имеет наблюдаемую эффект.

Как я могу написать функцию id на C ++ 0x, которая, в частности, работает для типов без конструкторов перемещения / копирования.

7
задан Community 23 May 2017 в 12:04
поделиться