La lettura della risposta this relativa alla restituzione dei riferimenti di valore dalla funzione mi ha fatto pensare, come posso scrivere una funzione id
in C++ 0x.Funzione "id" in C++ 0x
Fondamentalmente, voglio che la funzione id
non funzioni, una funzione che non ha effetti osservabili sul programma.
Il mio primo tentativo è la seguente:
#include <iostream>
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 <class T>
T&& id(T&& x) { return static_cast<T&&>(x); }
int main()
{
auto&& x1 = X("x1");
std::cout << "Line 1" << std::endl;
auto&& x2 = id(X("x2"));
std::cout << "Line 2" << std::endl;
}
Tuttavia, temo che in questo caso, x2 è un riferimento penzoloni, come X("x2")
viene distrutto prima di "Linea 2" esegue.
Quindi, qui chiaramente, id
ha un effetto osservabile.
Come posso scrivere una funzione id
in C++ 0x, che funziona in particolare per i tipi senza costruttori move/copy.
Il problema è che una dichiarazione di funzione non comunica se il riferimento restituito si riferisce ancora allo stesso oggetto che è stato passato ad esso. E non è ragionevole forzare i compilatori a verificare l'implementazione della funzione al fine di determinare cosa esattamente ritorna e fare in modo che la vita di un temporaneo dipenda da questa analisi. – sellibitze