Domanda

Come si può dire se o non un dato parametro è un rvalue in C++03?Sto scrivendo alcune generiche di codice e sono nel bisogno di un riferimento, se possibile, o la costruzione di un nuovo oggetto altrimenti.Posso sovraccarico di prendere da-valore e per riferimento e non hanno il rvalue chiamata restituisce il valore della funzione?

O devo molto nauseante sensazione che questo è il motivo per cui riferimenti rvalue sono in C++0x?

Edit:

is_rvalue = !(is_reference || is_pointer) ?

È stato utile?

Soluzione

Ci pare un modo per determinare se l'espressione è un valore assegnabile rvalue o in C ++ 03 (Dico apparentemente perché io non sono sicuro di quanto bene ho capito la tecnica). Nota che per rendere la tecnica utilizzabile, preprocessore macro sono praticamente obbligatori. Eric Niebler ha scritto un bel articolo su come funziona e come viene usato in BOOST_FOREACH:

Si noti che l'articolo è una lettura piuttosto pesante (almeno lo è per me); come dice Neibler in esso:

  

Non c'è dubbio che questa è roba arcana, ma vengono premiati con un modo robusto per rilevare il rvalue-ness e lvalue-ness di ogni espressione.

Uso della rilevazione rvalue descritto nel artcile potrebbe aiutare a trattare con almeno alcuni dei problemi che i riferimenti rvalue del C ++ 0x risolvere.

Altri suggerimenti

  

Come si può sapere se un dato parametro è un rvalue in C ++ 03?

Non è possibile. Tutto quello che puoi fare è di fiducia i vostri clienti e ingannare:

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 */
}
  

Sto scrivendo un codice molto generico

Allora temo C ++ 03 non è tagliato per voi.

  

Oppure devo una sensazione molto nauseante che questo è il motivo per cui i riferimenti rvalue sono in C ++ 0x?

Hai ragione, è necessario C ++ 0x e riferimenti rvalue per farlo.

La cosa più vicina che posso pensare è quello di prendere qualcosa da const riferimento che possono legarsi sia ad un lvalue o un rvalue (se il rvalue ha bisogno di costruire una temporanea lo farà). Detto questo, il codice non sarà in grado di distinguere tra i due.

O devo molto nauseante sensazione che questo è il motivo per cui riferimenti rvalue sono in C++0x?

Yup.Che è esattamente il motivo per cui si è aggiunto il C++0x.Non è possibile creare sovraccarichi in C++ per distinguere tra rvalues e lvalues.

Sto scrivendo un codice molto generico e sono nel bisogno di fare un riferimento, se possibile, o la costruzione di un nuovo oggetto altrimenti.

Non sarà questo fare quello che vuoi?

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

Si noti che ...

T t; f(t); // calls f(T&)
f(T()); // calls f(T const&)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top