Не имеет значения, насколько интерпретируется код C++; вы можете писать все, что захотите. Однако возникает вопрос о стиле и читаемости: как правило, вы не должны скрывать указатели, ссылки и квалификаторы CV и, возможно, даже интеллектуальные указатели, в псевдонимах типов, так как это затрудняет понимание читателем, что это то, что происходит. Типичные псевдонимы должны упаковывать семантически релевантный тип содержимого, тогда как классификаторы и модификаторы должны оставаться видимыми. Так предпочитают следующее:
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;
}
И не говори:
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
Отметим также, что ссылки на Отборочные (в отличие от указателей) действительно изменить тип переменной, которая быть объявлена, поэтому они не являются факультативно:
X & f();
auto a = f(); // copy!
auto & b = f(); // b is the same as the return value of f()
И, наконец, добавление явных указателей указателя const может помочь const-correctness. Рассмотрим следующий пример, в котором контейнер содержит указатели-to-mutable, но нам нужен только доступ к const. Просто auto *
бы вывести указатель на изменяемые, который мы можем избежать, говоря const
явно:
std::vector<X*> v = /* ... */;
for (const auto * p : v)
{
observe(p->foo()); // no need for a mutable *p
}
Как 'MyFn' тип возвращаемого значения является' int', 'Авто * р = п (х, х)' не компилировать (благодаря '*', иначе нам стоит подождать 'p-> Create()' для ошибки) :-). – Jarod42
@ Jarod42: Да, я использовал слишком мало разных сущностей. Исправлена. –