2014-01-12 7 views
0

Я понимаю, что мы можем использовать auto как:Что такое использование авто?

auto a = 1; 
auto b = Foo(1,2); 

Или в вызове функции:

auto foo(){ 
    return Foo(1,2); 
} 

Но C++ 11 также обеспечивает равномерную инициализацию и инициализации список, так что мы можем сделать:

Foo a {1,2}; 
Foo b = {1,2}; 
Foo foo(){ 
    return {1,2}; 
} 

Так что же использовать auto, если у нас уже есть синтаксис фигурных скобок? (за исключением определения примитивного типа)

+1

Тривиальный пример: 'auto it = v.beg in() 'где' v' - некоторый контейнер типа 'T' в выведенном контексте. – juanchopanza

+1

Взгляните на статью [Herb Sutter's «AAA-style»] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/). – Casey

+0

Использование 'auto' для вывода возвращаемого типа функции является функцией C++ 1y. В C++ 11 существует только функция auto foo() -> Foo; 'trailing-return-type (и возврат типа возврата для простых lambdas). – dyp

ответ

1

auto подходит для шаблонов и итераторов.

Не только это может упростить синтаксис и улучшить читаемость кода, но также может привести к устаревшему использованию широкого использования шаблонов.

Отъезд this guy's page - очень приятно и точно.

Conciser следующее:

template <typename BuiltType, typename Builder> 
void makeAndProcessObject (const Builder& builder) { 
    BuiltType val = builder.makeObject(); 
    // ... 
} 

Теперь auto вы можете избавиться от нескольких типов в шаблоне:

template <typename Builder> 
void makeAndProcessObject (const Builder& builder) 
{ 
    auto val = builder.makeObject(); 
    // ... 
} 

Кроме того, если вы на самом деле вызвать эту функцию, вы не необходимо указать любой тип в качестве параметра шаблона:

MyObjBuilder builder; 
makeAndProcessObject(builder); 
+0

Это также можно легко решить без авто.А именно с 'typedef'. Хотя можно считать, что 'auto' более элегантные другие могут считать' typedef 'лучше, поскольку он отображает связь между' Builder' и 'BuiltType' в коде. Помимо этого, два фрагмента эквивалентны: вы не можете создать (/ default construct) объект типа 'BuiltType' в нижеприведенном фрагменте без вызова' makeObject() '. В приведенном выше примере это было бы возможно. – Paranaix

6

Я думаю, что наилучшее использование auto можно увидеть, когда вы используете его с хорошими итераторами. Сравните:

for (std::vector<int>::iterator it = vector.begin(); it != vector.end(); ++it) 

к:

for (auto it = vector.begin(); it != vector.end(); ++it) 

Несмотря на то, в C++ 11 мы диапазонам Форс, что выручает намного лучше, итераторы все еще широко используются в тех случаях, когда ваш диапазон не четко определены или вам нужно выполнить действие над элементами.

В общем случае auto может быть полезен, когда тип, то есть тип PITA, может быть автоматически выведен компилятором.

3

Если тип возврата не указан Вам нужен авто. Например, std::bind.

using namespace std::placeholders; 
int n = 7; 
auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n); 
+0

Кроме того, лямбда-выражения. Вы * можете * использовать 'decltype' для получения типа' bind'-expression, но это не работает для lambdas, поскольку тип * каждого * лямбда-выражения является уникальным (и они могут не отображаться как неоцененные операнды IIRC). – dyp

Смежные вопросы