decltype vs auto

Как я понимаю, и decltype и auto попытаются выяснить, что это за тип.

Если мы определим:

 int foo () { return 34; } 

Тогда обе декларации являются законными:

 auto x = foo(); cout << x << endl; decltype(foo()) y = 13; cout << y << endl; 

Не могли бы вы рассказать мне, в чем основное отличие между decltype и auto ?

    decltype дает объявленный тип передаваемого ему выражения. auto делает то же самое, что и вычет типа шаблона. Так, например, если у вас есть функция, возвращающая ссылку, auto прежнему будет значением (вам нужно auto& получить ссылку), но decltype будет точно типом возвращаемого значения.

     #include  int global{}; int& foo() { return global; } int main() { decltype(foo()) a = foo(); //a is an `int&` auto b = foo(); //b is an `int` b = 2; std::cout << "a: " << a << '\n'; //prints "a: 0" std::cout << "b: " << b << '\n'; //prints "b: 2" std::cout << "---\n"; decltype(foo()) c = foo(); //c is an `int&` c = 10; std::cout << "a: " << a << '\n'; //prints "a: 10" std::cout << "b: " << b << '\n'; //prints "b: 2" std::cout << "c: " << c << '\n'; //prints "c: 10" } 

    Также см. Ответ Дэвида Родригеса о местах, в которых возможно только одно из auto или decltype .

    auto (в контексте, где он указывает тип) ограничивается определением типа переменной, для которой существует инициализатор. decltype – это более широкая конструкция, которая, за счет дополнительной информации, выведет тип выражения.

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

     auto x = foo(); // more concise than `decltype(foo()) x` std::vector v{ foo() }; // cannot use `auto` 

    Ключевое слово auto также используется в совершенно несвязанном контексте при использовании возвращаемых возвращаемых типов для функций:

     auto foo() -> int; 

    Там auto является только лидером, так что компилятор знает, что это объявление с возвращаемым типом возврата. Хотя приведенный выше пример может быть тривиально преобразован в старый стиль, в общем программировании это полезно:

     template  auto sum( T t, U u ) -> decltype(t+u) 

    Обратите внимание, что в этом случае auto нельзя использовать для определения типа возврата.

    Как правило, если вам нужен тип переменной, которую вы собираетесь инициализировать, используйте auto . decltype лучше использовать, когда вам нужен тип для чего-то, что не является переменной, как тип возврата.