R-значения в C ++ 03 - PullRequest
       25

R-значения в C ++ 03

4 голосов
/ 11 июня 2010

Как вы можете определить, является ли данный параметр значением в C ++ 03?Я пишу некоторый очень общий код и мне нужно взять ссылку, если это возможно, или создать новый объект иным способом.Могу ли я перегрузить, чтобы получить как по значению, так и по ссылке, и чтобы возвращаемые значения rvalue вызывали функцию по значению?

Или у меня очень неприятное чувство, что именно поэтому ссылки на значения в C ++ 0x?

Редактировать:

is_rvalue =! (Is_reference || is_pointer)?

Ответы [ 5 ]

5 голосов
/ 11 июня 2010

Очевидно, что есть способ определить, является ли выражение rvalue или lvalue в C ++ 03 (очевидно, я говорю, потому что я не уверен, насколько хорошо я понимаю технику).Обратите внимание, что для того, чтобы использовать эту технику, макросы препроцессора в значительной степени необходимы.Эрик Ниблер написал прекрасную статью о том, как это работает и как он используется в BOOST_FOREACH:

Обратите внимание, чтостатья довольно тяжело читается (по крайней мере, для меня);как говорит в ней Neibler:

Нет сомнений в том, что это загадочные вещи, но мы вознаграждены надежным способом обнаружить rvalue-ness и lvalue-ness любого выражения.

Использование обнаружения rvalue, описанного в artcile, может помочь вам решить, по крайней мере, некоторые из проблем, которые решают ссылки на rvalue в C ++ 0x.

2 голосов
/ 11 июня 2010

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

1 голос
/ 11 июня 2010

Я пишу какой-то очень общий код и мне нужно взять ссылку, если это возможно, или создать новый объект иным способом.

Разве это не делает то, что вы хотите?

void f(T& t);
void f(T const& t);

Обратите внимание, что ...

T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)
1 голос
/ 11 июня 2010

Или у меня очень неприятное ощущение, что именно поэтому ссылки на значения на C ++ 0x?

Да. Именно поэтому они добавлены в C ++ 0x. Вы не можете создавать перегрузки в C ++, чтобы различать rvalues ​​и lvalues.

1 голос
/ 11 июня 2010

Или у меня очень неприятное ощущение, что именно поэтому ссылки на значения на C ++ 0x?

Вы правы, для этого вам нужны ссылки на C ++ 0x и rvalue.

Самое близкое, что я могу придумать, это взять что-то по const-reference, поскольку оно может связываться либо с lvalue, либо с rvalue (если для rvalue требуется создать временное значение, это будет). Тем не менее, ваш код не сможет различить два.

...