Non ha importanza per quanto riguarda l'interpretazione del codice C++; puoi scrivere quello che vuoi Tuttavia, c'è una questione di stile e leggibilità: in generale, non devi nascondere i qualificatori di puntatori, riferimenti e CV, e forse anche i puntatori intelligenti, in alias di tipi, poiché rende più difficile per il lettore capire che è ciò che sta accadendo. Gli alias di tipo dovrebbero includere il contenuto di tipo semanticamente rilevante, mentre i qualificatori e i modificatori dovrebbero rimanere visibili. Così preferiscono la seguente:
using Foo = long_namespace::Foobrigation<other_namespace::Thing>;
using MyFn = const X * (int, int);
std::unique_ptr<Foo> MakeThatThing(MyFn & fn, int x) // or "MyFn * fn"
{
const auto * p = fn(x, -x);
return p ? p->Create() : nullptr;
}
E non dire:
using PFoo = std::unique_ptr<Foo>; // just spell it out
using MyFn = int(&)(int, int); // unnecessary; & is easy to spell
auto p = fn(x, -x); // Don't know that p is a pointer
Si noti inoltre che le qualificazioni di riferimento (a differenza di puntatori) cambiare veramente il tipo di variabile che viene dichiarato, quindi non sono facoltativo:
X & f();
auto a = f(); // copy!
auto & b = f(); // b is the same as the return value of f()
Infine, l'aggiunta di qualifiche esplicite del puntatore const può essere d'aiuto nella cost-correttezza. Considera il prossimo esempio, in cui un contenitore contiene puntatori a mutevole, ma abbiamo solo bisogno dell'accesso const. Basta auto *
sarebbe dedurre un puntatore ad mutevole, che possiamo evitare dicendo const
esplicitamente:
std::vector<X*> v = /* ... */;
for (const auto * p : v)
{
observe(p->foo()); // no need for a mutable *p
}
fonte
2016-01-01 21:51:33
Come 'MyFn' tipo restituito è' int', 'Auto * p = fn (x, -x)' si può essere compilato (grazie a '*, altrimenti dovremmo aspettare' p-> Crea() 'per l'errore) :-). – Jarod42
@ Jarod42: Sì, stavo usando troppo poche entità diverse. Fisso. –