Здравствуйте, igna, Вы писали:
I>Здравствуйте, Слава, Вы писали:
С>>C++ невозможно отличить создание временнoгo обьекта от вызова функции:
С>>int a = foo(B(x)); — что здесь B(x) ?
I>А это действительно важно? Конструктор ведь и есть функция создающая объект.
Да, но тут под капотом ещё и вызов деструктора. Кода весь код свой — можно жить, а когда чужой разбираешь?
Спасибо за внимание
Re[18]: The variable is being used without being initialized
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, Lloyd, Вы писали:
L>>Ну вот и не усугубляйте. Добавление фичи в язык — проблема сложная не технически, а концептуально. Нужно чтобы фича хорошо "легла" на язык, чтобы грамотно состыковалась с остальными фичами. Путем выставления потрохов компилятора наружу и разрешения всем и каждому менять синтаксис, эта проблема не решается.
Z>Ситуация очень похожа на ситуацию с var в C#. Было огромное количество холиваров, по поводу опасности его использования. На рсдн в частности. Но был один интересный факт, все кто, яро отстаивал их опасность ни разу их не использовал в полной мере и эту опасность все выводили путем логических построений. Эти построения для выглядят очень убедительно. В результате мир C# раскололся на два лагеря, тех кто юзал var и не ощущал страшных последствий и тех, кто не юзал и бодро поддерживал теорию о его крайней опасности для читабельности и понимания кода.
Z>Интересно было наблюдать, как некоторые противники var, в следующем холиваре становятся его сторонниками (просто, за это время, они поели устриц). Буквально вчера была невиртуальная дискуссия с С++-ником переходящим на шарп. Он очень скептически относился к этому кейворду, я сразу вспомнил эти холивары с 2008 года.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Слава, Вы писали:
С>>Да, но тут под капотом ещё и вызов деструктора. Кода весь код свой — можно жить, а когда чужой разбираешь?
I>Вызов деструктора здесь есть назависимо от того, является ли B конструктором или функцией возвращающей объект.
Точно
Спасибо за внимание
Re[6]: C++, неявное преобразование signed <-> unsigned
Здравствуйте, igna, Вы писали:
I>Тогда компилятор начинает выдавать всякую ерунду.
значит ваш код плохой.
код должен нормально компилиться c /W4 — стандартная библиотка компилится с /W4, большинство либ буста тоже.
если либа не компилится с /W4, используйте #pragma warning,
если ваш код не компилится с /W4 — правьте ваш код.
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, Слава, Вы писали:
С>>Здравствуйте, alpha21264, Вы писали:
A>>>А еще: A>>>0) нельзя использовать русские буквы в именах переменных и функций
С>>А это зачем? сделать 1С из С++ ?
A>Ложная связка. Java по твоему 1С?
Разве кто-то этим пользуется?
Спасибо за внимание
Re[25]: The variable is being used without being initialized
Здравствуйте, Lloyd, Вы писали:
L>Каким образом statement может что-то возвращать?
a return что, не statement?
Q>>Ты просто скрыл недостижимую константность внутри. Снаружи всё константное, но внутри по прежнему программист может «вклиниться» в момент, где какая-то переменная уже создана, но ещё не инициализирована.
L>Каким образом?
Внутренняя «double y» у тебя не константа, и какое-то время пребывает в неинициализированном состоянии. Во, ещё один эксплоит придумал, даже без исключений. Предположим, у тебя рассчёт производится в сторонней библиотеке:
И всё бы ничего, но в один прекрасный день разработчики сторонней библиотеки изменили код:
void compute(double sin_φ, double& y)
{
if (0.0 < y) // Использование потенциально неинициализированной переменной.
y = 0.5 * ::log((1.0 + sin_φ) / (1.0 - sin_φ));
}
И всё! Даже исключения об использовании неинициализированной переменной не будет! Компилятор в общем случае не в состоянии понять, что во внешней функции с переданной ссылкой творится.
Q>>Просто вбей в редактор и проверь (именно так я и сделал). Только синтаксис C++0x-замыканий используй: «[=]() -> double { ...; return ...; }». L>Нет у меня редактора, я говорю о гипотетическом языке.
Я так понял, ты говоришь о гипотетическом языке, который будет расширять сахаром существующий язык (или аналог), заменяя существующий подход более простым синтаксически. Очевидно, C++ таким образом не расширишь. В него и лямбды-то со скрипом всунули, да и то получилось не ахти.
L>Предложенный let работает только в выражениях. Ты предлагаешт выбросить все императивные конструкции?
А что, было бы неплохо. И уже для имитации императивных конструкций добавлять сахар, который позволит вместо вложенной структуры байндингов использовать линейную последовательность «инструкций» с «присваиваниями»... Постойте-ка, где-то я это уже видел!
Q>>В заключение хочу сказать вот что. Так как в наших широтах сейчас стоит прелестнейшая погода, предлагаю засчитать мне технических слив, а я отправлюсь бегать кросс. L>Ну уж нет, рано или позно ты вернешься. :)
:)
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: C#: Ограничение области видимости локальной переменно
Здравствуйте, Lloyd, Вы писали:
C>>Достаточно изменить немного семантику const-переменных. Они должны быть константными не с создания, а с первого присваивания. L>Надеюсь теперь Qbit86-таки согласится, что это возможно. :)
Здравствуйте, Undying, Вы писали:
WH>>Причем чтобы достать оттуда значение нужно явно проверить, что там что-то есть. U>Зачем для этого вводить кошмарный Option?
Это идиома, она везде есть, чем C# хуже? (Да, как минимум тем, что в нём с этим Option'ом паттерн-матчить не так удобно, как в нормальных языках.)
Option можно трактовать как коллекцию, состояющую из нуля или одного элемента. Преполезнейшая штука.
Про паттерн try-get в C# слышал? Так вот, он нахрен не нужен, если б сразу Option<T> использовали как, опять же, в библиотеках нормальных языков.
Здравствуйте, Qbit86, Вы писали:
Q>Про паттерн try-get в C# слышал? Так вот, он нахрен не нужен, если б сразу Option<T> использовали как, опять же, в библиотеках нормальных языков.
Здравствуйте, Undying, Вы писали:
U>Что такое паттерн try-get?
Я название исказил. В «FDG» это называется Tester-Doer Pattern. Это когда к методу Parse, бросающему исключение, добавляют метод TryParse с мерзкими out-параметрами и возвращаемым bool'ом. Или когда в ассоциативном контейнере наряду с индексатором, бросающим исключение *NotFound есть метод TryGeValue с упомянутым out-параметром и возвращающим bool. Вот это костыли так костыли. Уж лучше из таких методов возвращать IEnumerable<Result>, всегда состоящий из нуля или одного элемента (если религия не позволяет идиоматичный Option<Result> использовать).
Здравствуйте, alpha21264, Вы писали:
A>2) и вообще переопределенных операторов как-то мало
По-моему, их слишком много.
A>3) нельзя return x,y ;
Ну, кортежи в Бусте есть. Без деконструкции паттерн-матчингом, конечно, тяжело, но и там, вроде, были какие-то костыли вроде boost::tuples::tie(x, y).
A>4) нет безымянных функций и нельзя сделать вот так "функция( { тут какое-нибудь выражение } )"
В C++0x есть.
A>6) В STL нет контейнера "граф"
А чем бустовские графы не устраивают?
Глаза у меня добрые, но рубашка — смирительная!
Re[26]: The variable is being used without being initialized
Здравствуйте, Qbit86, Вы писали:
Q>А что, было бы неплохо. И уже для имитации императивных конструкций добавлять сахар, который позволит вместо вложенной структуры байндингов использовать линейную последовательность «инструкций» с «присваиваниями»... Постойте-ка, где-то я это уже видел!
В немерле?
Причем весь сахар макросами сделан.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн