R-значения в C++03
Вопрос
Как определить, является ли данный параметр значением rvalue в C++03?Я пишу очень общий код, и мне нужно, если это возможно, взять ссылку или в противном случае создать новый объект.Могу ли я перегрузить, чтобы принимать как по значению, так и по ссылке, и чтобы возвращаемые значения rvalue вызывали функцию по значению?
Или у меня очень неприятное ощущение, что именно поэтому ссылки rvalue используются в C++0x?
Редактировать:
is_rvalue = !(is_reference || is_pointer) ?
Решение
Там, по-видимому, это способ определить, является ли выражение RValue или Lvalue в C ++ 03 (я видимо, видимо, потому что я не уверен, насколько хорошо я понимаю технику). Обратите внимание, что для того, чтобы сделать технику пригодным для использования, для препроцессорных макросов в значительной степени требуется. Эрик Ньеблер написал хорошую статью о том, как она работает и как она используется в Boost_Foreach:
Обратите внимание, что статья довольно тяжелое чтение (по крайней мере, для меня); Как говорит Neibler в этом:
Нет никаких сомнений в том, что это тайное вещество, но мы вознаграждаем надежным способом обнаружения RValue-Ness и Lvalue-Ness любого выражения любого выражения.
Использование обнаружения RValue, описанное в артиллере, может помочь вам иметь дело с несколькими проблемами, которые решают ссылки RValue C ++ 0x.
Другие советы
Как вы можете сказать, является ли данный параметр RValue в C ++ 03?
Вы не можете. Все, что вы можете сделать, это доверять своим клиентам и обмануть:
void call_me_with_anything(const T& const_ref)
{
/* read from const_ref */
}
void call_me_with_rvalue_only_please_i_trust_you(const T& const_ref)
{
T& ref = const_cast<T&>(const_ref);
/* write through ref */
}
Я пишу немного очень общий код
Тогда я боюсь, C ++ 03 не сократит его для вас.
Или у меня очень отвратительное чувство, что именно поэтому RValue ссылки на C ++ 0x?
Вы правы, вам нужен ссылки C ++ 0x и RValue, чтобы сделать это.
Ближайшая вещь, которую я могу придумать, - это взять что-то консте-ссылку, как это может связываться с Lvalue или rvalue (если rvalue нужно построить временной, он будет). Тем не менее, ваш код не сможет различать два.
Или у меня очень неприятное ощущение, что именно поэтому ссылки rvalue используются в C++0x?
Ага.Именно поэтому они добавлены в C++0x.В C++ нельзя создавать перегрузки, чтобы различать значения rvalue и lvalue.
Я пишу несколько очень общий код и нуждаюсь в приеме ссылки, если это возможно, или построить новый объект в противном случае.
Разве это не сделает то, что вы хотите?
void f(T& t);
void f(T const& t);
Обратите внимание, что...
T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)