Чтение этого ответа относительно возврата ссылок 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, которая, в частности, работает для типов без конструкторов перемещения / копирования.