Re[3]: Как можно было так протупить с const параметрами?
От: Went  
Дата: 23.08.22 06:42
Оценка:
Здравствуйте, DiPaolo, Вы писали:
DP>На практике так конечно никто не пишет )) Но лично я отношусь к входящим параметрам как "к чужому" — не мне их менять, это стартовые условия для вычислений.
Практика С++ подразумевает разные подходы и разные предметные области. Если для вас скопировать какую-то переменную не критично ради лучше читаемости, то в другой предметной области это может очень даже болезненно. А еще есть обобщенный код, и вместо того int size может оказаться T size, которому подставили какого-то монстра с нетривиальным копированием. И вместо мува, мы получим копирование.
Re[5]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 06:42
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Вы вводите в заблуждение: вы говорите про параметры, но подразумеваете параметры, передаваемые по значению.


Это способ передачи параметров по умолчанию
Маньяк Робокряк колесит по городу
Re[3]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 06:45
Оценка:
Здравствуйте, Shtole, Вы писали:

S>Как бы, язык давно уже разделился на C++14, C++17, C++20. Вполне можно было бы ввести что-то типа 'use strict' #pragma strict.


Даёшь еще более навороченный и запутанный C++!!!
Маньяк Робокряк колесит по городу
Re[3]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 06:47
Оценка:
Здравствуйте, sergii.p, Вы писали:


SP>смысл такой же как и объявлять любую переменную const


SP>
SP>foo(const int i) // объявляем, что i меняться нигде дальше не будет
SP>{
SP>    const int k = i; // тоже самое. 
SP>    ... // и тут кода на тыщу строк, чтобы сполна могли насладиться бонусами const
SP>}
SP>


Это намек компилятору, что можно вычислить в компайл-тайм один раз. С параметрами так не получится, они в любом случае живут в рантайме
Маньяк Робокряк колесит по городу
Re[4]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 06:48
Оценка:
Здравствуйте, T4r4sB, Вы писали:

SP>>А то, что нельзя мувать const объекты — это уже явная бага C++. Впрочем она растёт из "use after move".


TB>Она растёт из того, что move это не мув, а что-то типа свапа с чистым объектом.


Что ты подразумеваешь под "чистым" объектом?
Маньяк Робокряк колесит по городу
Re[3]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 06:53
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Ситуация, когда изменяется входящий параметр, достаточно нелогичная. Входящие параметры по значению — это, считай, настройки, конфиг. И менять их — весьма нетипичная и даже в некоторой степени является воркэраундом. Надо тебе что-то повычислять — заведи свою переменную, куда скопируй входное значение. А потом меняй его как хочешь. Изменение входящих параметров 100% ведет к багам и это является заложенной тайм-бомбой.


Вполне логичная. Ок. Это конфиг. Перед использованием заданные конфигом параметры надо проверить, и привести в допустимый диапазон.

void doSomething( string str )
{
    str = trim(str);
    str = to_upper(str);
    str = replace(str,'-','_');
    // еще куча вызовов для нормализации заданного аргумента

    // колбасим рабочий код тут
}



Можно конечно так:
void doSomething( string str )
{
    string strTrimmed = trim(str);
    string strTrimmedUpper = to_upper(strTrimmed);
    string strTrimmedUpperNormalizedSeps = replace(strTrimmedUpper,'-','_');
    //...
}


Но это очень такое себе
Маньяк Робокряк колесит по городу
Re[4]: Как можно было так протупить с const параметрами?
От: DiPaolo Россия  
Дата: 23.08.22 06:57
Оценка:
DP>>На практике так конечно никто не пишет )) Но лично я отношусь к входящим параметрам как "к чужому" — не мне их менять, это стартовые условия для вычислений.

Тут речь шла про применение модификатора конст для входных параметров встроенных типов, типа const int param.

W>Практика С++ подразумевает разные подходы и разные предметные области. Если для вас скопировать какую-то переменную не критично ради лучше читаемости, то в другой предметной области это может очень даже болезненно.


Спасибо, я в курсе
Патриот здравого смысла
Re: Как можно было так протупить с const параметрами?
От: Went  
Дата: 23.08.22 07:12
Оценка:
Здравствуйте. Да, век живи — век учись. Раз такое работает:
#include <iostream>
using namespace std;

struct A
{
    void f(const int a);
};

void A::f(int a)
{
    a = 5;
    cout << "Wow!";
}

int main() 
{
    A a;
    a.f(1);
    return 0;
}

То вполне можно было сделать так, что в заголовке константность запрещать (она все равно игнорируется), а в реализации сделать константу по умолчанию, а разрешать менять словом mutable. Но, блин, это ломает обратную совместимость.
Re[4]: Как можно было так протупить с const параметрами?
От: Shtole  
Дата: 23.08.22 07:15
Оценка:
Здравствуйте, Marty, Вы писали:

S>>Как бы, язык давно уже разделился на C++14, C++17, C++20. Вполне можно было бы ввести что-то типа 'use strict' #pragma strict.


M>Даёшь еще более навороченный и запутанный C++!!!


Это как раз способ распутать. А то задолбали уже всё на легаси сваливать.
Do you want to develop an app?
Re[5]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 07:20
Оценка:
Здравствуйте, Shtole, Вы писали:

S>>>Как бы, язык давно уже разделился на C++14, C++17, C++20. Вполне можно было бы ввести что-то типа 'use strict' #pragma strict.


M>>Даёшь еще более навороченный и запутанный C++!!!


S>Это как раз способ распутать. А то задолбали уже всё на легаси сваливать.



- У нас есть 14 способов сделать одно и то же
...
— Я придумал новый, универсальный способ!!!

...

— У нас есть 15 способов сделать одно и то же

Маньяк Робокряк колесит по городу
Re[3]: Как можно было так протупить с const параметрами?
От: Shtole  
Дата: 23.08.22 07:38
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>На практике


ИМХО, на практике будет следующее. Какой-нибудь джун напишет auto size_mutable = size; (ну, чтобы можно было модифицировать, в этом же суть), а потом по невнимательности передаст size_mutable вместо size и... ничего плохого не случится. При первом же прогоне ошибка всплывёт и будет пофикшена. Всё это к реальным ошибкам (порче памяти) имеет мало отношения.

Но я, конечно, отнюдь не против, чтобы все параметры были константными по умолчанию.
Do you want to develop an app?
Re[6]: Как можно было так протупить с const параметрами?
От: Shtole  
Дата: 23.08.22 07:42
Оценка:
Здравствуйте, Marty, Вы писали:

S>>>>Как бы, язык давно уже разделился на C++14, C++17, C++20. Вполне можно было бы ввести что-то типа 'use strict' #pragma strict.


M>>>Даёшь еще более навороченный и запутанный C++!!!


S>>Это как раз способ распутать. А то задолбали уже всё на легаси сваливать.


M>

M>- У нас есть 14 способов сделать одно и то же
M>...
M>- Я придумал новый, универсальный способ!!!

M>...

M>- У нас есть 15 способов сделать одно и то же


Почему это сработало в Джаваскрипте и не сработает тут? Только без пересказов анекдотов с xkcd, пожалуйста.
Do you want to develop an app?
Re[5]: Как можно было так протупить с const параметрами?
От: T4r4sB Россия  
Дата: 23.08.22 17:46
Оценка:
Здравствуйте, Marty, Вы писали:

M>Что ты подразумеваешь под "чистым" объектом?


Для строк — пустую строку, для коллекций — пустую коллекцию. В общем виде — состояние объекта после дефолтного конструктора.
Я вообще не очень представляю, можно ли представить не-надуманный пример объекта, у которого есть мув-конструктор, но нет дефолтного конструктора.
Re[6]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.08.22 18:54
Оценка:
Здравствуйте, T4r4sB, Вы писали:

M>>Что ты подразумеваешь под "чистым" объектом?


TB>Для строк — пустую строку, для коллекций — пустую коллекцию. В общем виде — состояние объекта после дефолтного конструктора.

TB>Я вообще не очень представляю, можно ли представить не-надуманный пример объекта, у которого есть мув-конструктор, но нет дефолтного конструктора.


Меня смутило

TB>Она растёт из того, что move это не мув, а что-то типа свапа с чистым объектом.


мне казалось, что мув это типа свапа с непроинициализированным объектом
Маньяк Робокряк колесит по городу
Re[7]: Как можно было так протупить с const параметрами?
От: T4r4sB Россия  
Дата: 23.08.22 19:03
Оценка:
Здравствуйте, Marty, Вы писали:

M>мне казалось, что мув это типа свапа с непроинициализированным объектом


Тогда бы такой код сегфолтился
std::string a[2] = {"ololo", "trololo"};
auto b = std::move(a[rand() % 2]);

потому что после него бы в рандомном элементе массива a был бы неинициализированный объект, что вызвало бы проблемы при попытке вызвать деструктор
Re[3]: Как можно было так протупить с const параметрами?
От: AeroSun  
Дата: 29.08.22 13:25
Оценка: 1 (1)
Здравствуйте, Shtole, Вы писали:

S>Как бы, язык давно уже разделился на C++14, C++17, C++20. Вполне можно было бы ввести что-то типа 'use strict' #pragma strict.


У комитета по этому поводу ещё стадия отрицания полностью не прошла.
Ну, по крайней мере, полумеры начали делать, а значит ещё лет 50 и придут к прагмам и ключам компилятора
Re[5]: Как можно было так протупить с const параметрами?
От: ути-пути Россия  
Дата: 30.08.22 08:23
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Вы вводите в заблуждение: вы говорите про параметры, но подразумеваете параметры, передаваемые по значению.


Так они все и передаются во значению, в т.ч. и ссылки, и указатели. Да, это низкий уровень, не такой абстрактный, как во многих других языках.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: Как можно было так протупить с const параметрами?
От: B0FEE664  
Дата: 30.08.22 09:11
Оценка:
Здравствуйте, Marty, Вы писали:

M>
M>void doSomething( string str )
M>{
M>    str = trim(str);
M>    str = to_upper(str);
M>    str = replace(str,'-','_');
M>    // еще куча вызовов для нормализации заданного аргумента

M>    // колбасим рабочий код тут
M>}
M>


Почему не так:
void doSomething( string str )
{
    str = replace(to_upper(trim(str)),'-','_');
}
И каждый день — без права на ошибку...
Re[3]: Как можно было так протупить с const параметрами?
От: B0FEE664  
Дата: 30.08.22 09:41
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Ситуация, когда изменяется входящий параметр, достаточно нелогичная. Входящие параметры по значению — это, считай, настройки, конфиг. И менять их — весьма нетипичная и даже в некоторой степени является воркэраундом. Надо тебе что-то повычислять — заведи свою переменную, куда скопируй входное значение. А потом меняй его как хочешь.


Есть типичная ситуация, когда входящий параметр меняется оставаясь "неизменным":
void some_class::NewData(std::string msg)
{
  if ( ! msg.empty() )
    some_member.push_back(std::move(msg));      
}


DP> Изменение входящих параметров 100% ведет к багам и это является заложенной тайм-бомбой.

Предположение, что не const переменная не меняется является ошибочным.
И каждый день — без права на ошибку...
Re[5]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.08.22 12:14
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Почему не так:

BFE>
BFE>void doSomething( string str )
BFE>{
BFE>    str = replace(to_upper(trim(str)),'-','_');
BFE>}
BFE>


Можно и так, но в моем варианте проще отключить какую-либо из операций, при отладке, например.
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.