Какие IDE и текстовые редакторы могут определять тип переменных, объявленных с помощью ключевого слова auto в C ++ 11


person Johny    schedule 27.10.2013    source источник
comment
Eclipse тоже поддерживает это   -  person user1233963    schedule 28.10.2013
comment
Я был бы рад, если бы это было на emacs   -  person log0    schedule 16.10.2014
comment
Я отправил в YCM вопрос о поддержке, которая решит проблему для Vim: github.com/Valloric/YouCompleteMe/issues/1404   -  person Kyle Strand    schedule 07.03.2015
comment
Эээ, похоже, это было недавно добавлено как функция: github.com/Valloric/ycmd/pull / 88   -  person Kyle Strand    schedule 07.03.2015


Ответы (4)


Visual Studio 2010, Visual Studio 2012 и Visual Studio 2013 поддерживают определение типа для переменных, объявленных с помощью ключевого слова auto. Это относится как к подсказкам IntelliSense, так и к предложениям автозаполнения.

Начиная с Visual Studio 2010 поддержка C ++ IntelliSense была полностью переработана (см. Восстановление Intellisense). IntelliSense теперь управляется внешним интерфейсом компилятора C ++ Edison Design Group (EDG). Все, что может сделать EDG, вы увидите в IntelliSense.

Обратите внимание, что всплывающие подсказки IntelliSense будут отображать базовый тип для auto переменных. Он не будет снова обрабатывать дерево и заменять части соответствующими определениями типов. В Visual Studio 2012 следующий код

std::string str;

std::string::iterator i1 = str.begin();
auto i2 = str.begin();

отобразит итераторы как

std::basic_string<char,std::char_traits<char>,std::allocator<char> >::iterator i1

и

std::_String_iterator<std::_String_val<std::_String_base_types<char,std::allocator<char> >::_Val_types>::_Myt> i2

Учитывая, что я бы с радостью не согласился с Хербом Саттером в его оценке, что IDE достаточно, чтобы вывести тип, когда он вам нужен. auto великолепен с точки зрения надежности, правильности и гибкости, но он определенно не может удовлетворить потребности разработчика, работающего с большой базой кода.

person IInspectable    schedule 28.10.2013

Родная поддержка

  • Visual Studio 2010+
    • Caveat: Does not behave terribly well with typedefs; see iinspectable's answer
  • KDevelop 4.5.1+
    • Caveat: Some incorrect deductions (e.g. float literals); see Johnny's answer
  • Qt Creator 2.7.0+
  • Eclipse (не уверен, через плагин или собственный)

Поддержка через плагины

  • Vim plugins:
  • Emacs plugins:
    • ....SURELY there is such a plugin somewhere.

Примечание: первый черновик этого ответа был создан путем простого объединения существующих ответов плюс комментарий Eclipse, а затем добавления примечания о Vim. Без такого «совокупного» ответа этот вопрос (и его существующие ответы), по-видимому, нарушает правило «одного правильного ответа».

Это действительно должно быть отформатировано как таблица; Жаль, что у нас нет такой возможности.

person Community    schedule 07.03.2015

KDevelop 4.5.1 также поддерживает определение типа. Хотя, вероятно, допускает небольшие ошибки.

Примеры:

auto i = 3;    // Deduces int
auto d = 3.0;  // Deduces double
auto f = 3.0f; // Deduces double - wrong
person Johny    schedule 28.10.2013

Qt Creator 2.7.0 тоже может это делать, судя по исходному коду тестирования:

class A
{
    void f();
};

int main()
{
    auto a = A();
    return 0;
}
person Martin Drozdik    schedule 28.10.2013
comment
Небольшое примечание: я проверил Qt Creator, и он знает тип переменной и предлагает автоматическое завершение методов / атрибутов, но когда вы наводите курсор на имя переменной, он не дает вам тип переменной (это касается переменных, объявленных без авто). - person Johny; 28.10.2013
comment
Еще одно замечание: несмотря на то, что это старый поток, Qt Creator не поддерживает автозаполнение для типов сборки (любой контейнер std не будет обеспечивать автозаполнение) или для типов Qt. Только для определяемых пользователем типов (проверено с Qt Creator 3.2 RC1) - person LoPiTaL; 02.09.2014