Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/55: Рейтинг темы: голосов - 55, средняя оценка - 4.56
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175

Почему тип auto недопустим?

12.01.2020, 13:08. Показов 12097. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго, разбираюсь с auto, имеется вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
class MyClass
{
private:
    auto myField = 0.0;
public:
    MyClass() {};
 
    void SetField(auto value) { myField = value; }
    auto GetField() { return myField; }
};
 
 
int main()
{
    MyClass A;
 
    A.SetField(13.76);
    cout << A.GetField();
 
    return 0;
}
Не совсем понятно почему нельзя использовать строчку:
C++
1
auto myField = 0.0;
Явно используется тип с плавающей запятой: double или float. В чем проблема то?

Это стандартная тема, насколько мне известно, проблем не возникнет.
C++
1
auto GetField() { return myField; }
auto value не разрешен, что вполне естественно. Но может можно это обойти?
C++
1
void SetField(auto value) { myField = value; }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.01.2020, 13:08
Ответы с готовыми решениями:

Виртуальные функции и тип auto
Хочу написать генератор рандомных значений разных типов как это можно реализовать? вот наброски (но при использ. аuto не компилируется): ...

Специализация и шаблон, возвращающий тип auto
template &lt;class T&gt; auto f(T a, int b)-&gt;decltype( *a ); template &lt;&gt; char * f&lt;&gt;(char *g, int); Добрый день уважаемые,...

Заменить auto на необходимый тип итератора
Есть структура typedef std::vector&lt;std::string&gt; Resp; struct View { // объявляем структуру для хранения Resp answers; //...

24
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.01.2020, 13:39
Цитата Сообщение от Battary Посмотреть сообщение
void SetField(auto value) { myField = value; }
Как компилятор должен понять что будет именно передаваться, сколько памяти надо выделить и прочие?

Вообще авто не стоит использовать, вы же программист, вы что не знаете какой тип данных у вас работает?

Цитата Сообщение от Battary Посмотреть сообщение
auto GetField() { return myField; }
а такая запись, если мне не изменяет память, доступна только в c++14. Но могу заблуждаться

Добавлено через 10 минут
Цитата Сообщение от Mesteriis Посмотреть сообщение
доступна только в c++14.
Ну да так и есть link

Добавлено через 4 минуты
Цитата Сообщение от Battary Посмотреть сообщение
void SetField(auto value) { myField = value; }
А сеторы обычно имеют тип bool что бы можно было контролировать, сейчас же контроль потерян. Да и void, если не брать высокие систенции, применяется только для того, что бы делать, что то, что не изменяет данные и не оказывает существенного влияния на работу. Например рисует в консоле заголовок или красит текст.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
12.01.2020, 13:41
Цитата Сообщение от Mesteriis Посмотреть сообщение
Вообще авто не стоит использовать, вы же программист
Ну очень часто бывает что название типа слишком большое, а программисты очень ленивые люди)
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,467
12.01.2020, 13:43
Battary, Почитайте лучше побольше про auto. Он в первую очередь создавался для конструкций, вида

C++
1
2
vector<string> v;
auto pos = v.begin(); // переменная pos имеет тип vector<string>::iterator
Его не надо использовать всюду.
К примеру, если бы мне пришлось работать с вашим кодом, я бы о вас думал примерно вот так
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.01.2020, 13:49

Не по теме:

Цитата Сообщение от AndryS1 Посмотреть сообщение
Ну очень часто бывает что название типа слишком большое, а программисты очень ленивые люди)
Ну современные среды подерживают шаблоны, если уж совсем ленивый, то наверно не та профессия выбрана.



2ТС спп это вообще строго типизированный язык. И с авто не стоит играется, иначе когда софтинка будет так строк на 1000, с отладкой будут суровые проблемы. Если прям совсем лень работать с типами, стоит задуматься о варианте другого языка, например JS, или если хочется что то серьезное то NodeJS

PS хотя я не представляю как можно работать с переменными, когда у тебя там может быть и int и double и строка и вообще объект, это для меня ужас)
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
12.01.2020, 13:53
Цитата Сообщение от Mesteriis Посмотреть сообщение
И с авто не стоит играется, иначе когда софтинка будет так строк на 1000, с отладкой будут суровые проблемы. Если прям совсем лень работать с типами, стоит задуматься о варианте другого языка, например JS, или если хочется что то серьезное то NodeJS
Тем не менее, зачем то его ввели в стандарт, значит его используют
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.01.2020, 13:55
Цитата Сообщение от AndryS1 Посмотреть сообщение
Тем не менее, зачем то его ввели в стандарт, значит его используют
Используют в качестве указателей, в прототипах и лямдах. Но судя по уровню вопроса ТС, ему не до них)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
12.01.2020, 14:30
Цитата Сообщение от AndryS1 Посмотреть сообщение
Тем не менее, зачем то его ввели в стандарт, значит его используют
Его возможно использовать там, где вывод типа затруднен или невозможен.
Например, тип объекта замыкания определяется компилятором:
C++
1
auto foo = [y](int x) { return x * y; }//тип foo будет выведен автоматически
Или, скажем, такое:
C++
1
2
3
4
5
6
7
8
9
10
11
std::string foo(char const *);
std::string foo(std::string);
long foo(int);
long foo(long);
double foo(double);
//...
template<typename T>
void bar(T arg)
{
    auto v = foo(arg);//Без auto будет несколько многословнее вывести нужный тип.
}
1
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
12.01.2020, 14:34  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Battary, Почитайте лучше побольше про auto. Он в первую очередь создавался для конструкций, вида

C++
1
2
vector<string> v;
auto pos = v.begin(); // переменная pos имеет тип vector<string>::iterator
Его не надо использовать всюду.
К примеру, если бы мне пришлось работать с вашим кодом, я бы о вас думал примерно вот так
Это понятно, просто балуюсь с auto. auto иногда позволяет использовать типы, которые вручную не напишешь или отлавливать ошибки связанные с разрядностью системы.(Не помню уже какой тип, но на х86 он занимал 32бита, а на х64 64бита, такие микро моментики)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2020, 14:37
Цитата Сообщение от Battary Посмотреть сообщение
Не совсем понятно почему нельзя использовать строчку:
auto myField = 0.0;
потому что не всё сразу.
ограничения связаны с техническими сложностями.

пройдет какое то время,
и какие то ограничения могут быть сняты.


Цитата Сообщение от Battary Посмотреть сообщение
auto value не разрешен, что вполне естественно. Но может можно это обойти?
void SetField(auto value) { myField = value; }
почему в одном случае ты считашь что ограничение вполне естественно,
а в другом - нет?

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

ну а покамест пиши шаблон, как это делали наши отцы и деды,
их отцы и отцы их отцов.

C++
1
2
3
4
template<class t> void SetField(t&& value) 
{ 
    this->myField = ::std::forward<t>(value); 
}
и так есть, и так будет до тех самых пор,
пока технологии не выйдут на новый уровень,
и мир не изменится.
аминь.
1
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.01.2020, 14:39
Цитата Сообщение от Battary Посмотреть сообщение
на х86 он занимал 32бита, а на х64 64бита,
Так это уже не много в сторону кросплатформености, есть "защищённые" типы данных которые гарантируют, что на переменную, не зависимо от окружения, будет выделено именно столько то бит.
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
12.01.2020, 14:47  [ТС]
Цитата Сообщение от Mesteriis Посмотреть сообщение
Как компилятор должен понять что будет именно передаваться, сколько памяти надо выделить и прочие?

Вообще авто не стоит использовать, вы же программист, вы что не знаете какой тип данных у вас работает?
Серьезно? Явно тестовая прога же ну
Ладно, там явно, пытаться из следствия вытянуть причину, компилятор так не умеет. Это все-равно что: r-значению = l-значение(утрирую).
C++
1
void SetField(auto value) { myField = value; }
Но вот почему не работает это?
C++
1
auto myField = 0.0;
Самое время ответить: "потому что", но это не ответ.
Будем ждать, пока это заработает.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2020, 14:51
Цитата Сообщение от Mesteriis Посмотреть сообщение
Вообще авто не стоит использовать, вы же программист, вы что не знаете какой тип данных у вас работает?
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Его не надо использовать всюду.
нужно больше auto богу auto!

Кликните здесь для просмотра всего текста
если кто не понял:
auto используют везде, где это удобно.
для этого он и существует.

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

но не нужно выдавать свои собственные проблемы с auto за проблемы Индустрии.
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
12.01.2020, 14:52
Цитата Сообщение от Battary Посмотреть сообщение
"потому что"
от чего же, ты сам на него ответил:
Цитата Сообщение от Battary Посмотреть сообщение
double или float
И теперь вопрос а все же что именно?
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
12.01.2020, 14:59  [ТС]
Цитата Сообщение от Mesteriis Посмотреть сообщение
И теперь вопрос а все же что именно?
Если написать это:
C++
1
auto myField = 0.0;
непосредственно, ну допустим, в main, тип будет double и почему-то все нормально.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,467
12.01.2020, 15:32
Цитата Сообщение от Battary Посмотреть сообщение
тип будет double
вроде как это нигде не прописано, но в плюсах для вещественных чисел по умолчанию в большинстве компиляторов используется тип double, точно так же как и для целых тип int

Добавлено через 2 минуты
то есть конструкции вида

C++
1
auto val = 0.0
C++
1
auto val = 1
будут иметь тип соответственно double и int
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
12.01.2020, 15:32
Цитата Сообщение от Recrut_rf Посмотреть сообщение
вроде как это нигде не прописано
Что именно? Литерал 0.0 имеет тип double. И это как раз прописано.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,467
12.01.2020, 15:48
Цитата Сообщение от Battary Посмотреть сообщение
Но вот почему не работает это?
а это не работает, скорее всего потому, что это часть класса. Как, по вашему, компилятор должен создавать объект с таким полем. Под него ведь нужно резервировать память. А в стандарте (по-моему) нигде не прописано, что по умолчанию вещественные числа имеют такой - то тип. А разница между флоатом и даблом 2 раза
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2020, 16:11
Цитата Сообщение от Recrut_rf Посмотреть сообщение
А в стандарте (по-моему) нигде не прописано, что по умолчанию вещественные числа имеют такой - то тип.
прописано:

5.13.4 Floating literals
The type of a floating literal is double unless
explicitly specified by a suffix. The suffixes f and F specify float, the suffixes l and L specify long double.

то бишь:

C++
1
2
auto v1 = 123.3 ; // double
auto v2 = 123.3f; // float
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
12.01.2020, 16:16
Цитата Сообщение от hoggy Посмотреть сообщение
со временем распространят использование и для обычных функции тоже
http://eel.is/c++draft/dcl.spec.auto#2
https://en.cppreference.com/w/... n_template
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.01.2020, 16:16
Помогаю со студенческими работами здесь

Тип auto в старых версиях компиляторов
Здравствуйте. Пытаюсь работать с данным циклом, но компилятор выдаёт ошибки. У меня не новая версия VS. Поэтому не поддерживаются некоторые...

почему не компилируется ? (сбой при преобразовании в COFF: файл недопустим или поврежден)
почему не компилируется ? ( #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main() { const int maxlen =...

Тип auto, вложенные функции и какого фига?
Разбираясь в чужом коде наткнулся на подобный код: void CheckSmthWhoCares(/*vector&lt;VAR_TYPE*&gt;*/void* Descr_) { auto lmbdDoSmth =...

Какой будет тип у переменной auto, которой присвоили лямда-функцию
Добрый день. Скажите пожалуйста, какой тип будет у переменной auto, которой присвоили лямбда функцию. Например: ... auto x =...

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не auto)?
Здравствуйте. Есть шаблонная функция (например, суммирования). Входные значения два итератора -- начало конец. template...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru