Вопрос

Как определить, является ли данный параметр значением 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&)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top