Russian Qt Forum
Ноябрь 23, 2024, 04:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: С++11 auto keyword  (Прочитано 5020 раз)
Akon
Гость
« : Январь 02, 2015, 10:29 »

Насколько интенсивно вы используете auto при объявлении переменных. Я вот поначалу использовал довольно интенсивно, но сейчас прихожу к выводу, что код становится менее читаемым из-за явного  отсутствия типа (особенно актуально на многомерных массивах/векторах - происходит "потеря размерности" при чтении кода, тогда как наличие перед глазами типа сразу освежает структуру многомерных массивов/векторов).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 02, 2015, 10:50 »

... но сейчас прихожу к выводу, что код становится менее читаемым из-за явного  отсутствия типа (особенно актуально на многомерных массивах/векторах - происходит "потеря размерности" при чтении кода, тогда как наличие перед глазами типа сразу освежает структуру многомерных массивов/векторов).
Совершенно верно, злоупотреблять не надо. И не лучше ли сделать этот топик с голосованием?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Январь 02, 2015, 13:46 »

Использую auto только тогда, когда это очевидно (для итераторов, например), или когда имя класса/namespace очень уж длинное. Иначе, код, особенно чужой, гораздо труднее сопровождать. Да IDE от этих auto периодически с ума сходит и автокомплит работать перестаёт.
Записан
CriDos
Гость
« Ответ #3 : Январь 02, 2015, 18:32 »

Стараюсь использовать как можно реже.
Простые типы данных, не имеет смысла объявлять с auto, только путаницу получим.
Сложные типы, желательно заранее именовать typedef'ом.
В некоторых случаях, применяю для работы с итераторами, если среда позволяет.
Всегда использую auto при создании лямбда-функций.

Как только среда научится во всех случаях корректно работать с объектами через auto, тогда мб чаще буду применять Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Январь 02, 2015, 21:16 »

AAA - Almost Always Auto.
Даже для простых типов (если это не int) лучше юзать авто. Сегодня у вас написано float f = getFloat(); завтра вы переделываете метод в getDouble(), а f поправить забываете.
Записан
Akon
Гость
« Ответ #5 : Январь 02, 2015, 21:26 »

В этом случае строгий компилятор выдаст ворнинг. А так спору нет, auto - это гибкость в ущерб наглядности и наоборот.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Январь 02, 2015, 23:45 »

В этом случае строгий компилятор выдаст ворнинг. А так спору нет, auto - это гибкость в ущерб наглядности и наоборот.

Вот незадача
Цитировать
/usr/bin/clang++ -arch x86_64 -g -Wall -Wextra -pipe -fvisibility=default -x c++ -std=c++0x -stdlib=libc++ -fPIC -DQT_CORE_LIB -DQT_TESTLIB_LIB -I/Users/arch/Work/RTS/limon/share/include -I/Users/arch/Work/RTS/limon/include -I/Developer/Qt/5.3/clang_64/lib/QtCore.framework/Headers -I/Developer/Qt/5.3/clang_64/mkspecs/macx-clang -I/Users/arch/Work/RTS/build-limon-Desktop_Qt_5_3_clang_64bit-Отладка/qtc_Desktop_Qt_5_3_clang_64bit_qt_53_c-debug/optional.qtc_Desktop_Qt_5_3_clang_64bit_qt_53_c/GeneratedFiles -I/Developer/Qt/5.3/clang_64/lib/QtTest.framework/Headers -F/Developer/Qt/5.3/clang_64/lib -c /Users/arch/Work/RTS/limon/tests/auto/optional/tst_optional.cpp -o /Users/arch/Work/RTS/build-limon-Desktop_Qt_5_3_clang_64bit-Отладка/qtc_Desktop_Qt_5_3_clang_64bit_qt_53_c-debug/optional.qtc_Desktop_Qt_5_3_clang_64bit_qt_53_c/.obj/tst_optional.cpp.o -mmacosx-version-min=10.7
/Users/arch/Work/RTS/limon/tests/auto/optional/tst_optional.cpp:30:11: warning: unused variable 'f' [-Wunused-variable]
    float f = getDouble();
          ^
1 warning generated.
Прошу обратить внимание на -Wextra
Аналогично для сужения int64 -> int16 НИКАКИХ ворнингов. Ну или шланг говно:)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 03, 2015, 08:37 »

AAA - Almost Always Auto.
Даже для простых типов (если это не int) лучше юзать авто. Сегодня у вас написано float f = getFloat(); завтра вы переделываете метод в getDouble(), а f поправить забываете.
Не всегда (а то и редко) по вызову можно легко догадаться о типе возвращаемого значения.
Код
C++ (Qt)
auto amount = CalcAmount(..);
И какой же тип имеет amount?
Записан
Akon
Гость
« Ответ #8 : Январь 03, 2015, 09:26 »

Нет никаких незадач Улыбающийся -Wall и -Wextra определяют лишь некоторые ворнинги, которые субъективно многими считаются наиболее востребованными и более-менее достаточными. -Wconversion, например, там не числится.

Пример к моему посту:
Main.cpp:
Код:
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;

double d = 0.0;
float f = d;
(void)f;

int i = 0;
short s1 = i;
(void)s1;

long long l = 0;
short s2 = l;
(void)s2;

return 0;
}

g++ -c -Wconversion Main.cpp
Код:
Main.cpp: In function 'int main(int, char**)':
Main.cpp:54:12: warning: conversion to 'float' from 'double' may alter its value [-Wconversion]
  float f = d;
            ^
Main.cpp:58:13: warning: conversion to 'short int' from 'int' may alter its value [-Wconversion]
  short s1 = i;
             ^
Main.cpp:62:13: warning: conversion to 'short int' from 'long long int' may alter its value [-Wconversion]
  short s2 = l;
             ^
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Январь 03, 2015, 11:46 »

Уболтали) Энивей, никто не будет руками эти флаги прописывать (ну, кроме фанатов СMake'а), тем более под разные компиляторы.
Да даже если они и прописаны, ходить и вычищать эти ворнинги по коду хуже, чем не ходить и не вычищать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.075 секунд. Запросов: 23.