Re[3]: C++ операция запятая
От: alpha21264 СССР  
Дата: 23.04.11 14:40
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, alpha21264, Вы писали:


A>>0) нельзя использовать русские буквы в именах переменных и функций


FR>
FR>int Проверка(int Переменная)
FR>{
FR>return Переменная + 1;
FR>}
FR>


FR>VC++ давно такое переваривает, последние gcc вроде тоже.


VC++ переваривает, но это не по стандарту.
gcc жрать отказывается. Гад.

Течёт вода Кубань-реки куда велят большевики.
Re[3]: C++ невозможно отличить создание временнoгo обьекта о
От: Слава Израиль  
Дата: 23.04.11 14:47
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Слава, Вы писали:


С>>C++ невозможно отличить создание временнoгo обьекта от вызова функции:


С>>int a = foo(B(x)); — что здесь B(x) ?


I>А это действительно важно? Конструктор ведь и есть функция создающая объект.


Да, но тут под капотом ещё и вызов деструктора. Кода весь код свой — можно жить, а когда чужой разбираешь?
Спасибо за внимание
Re[18]: The variable is being used without being initialized
От: Слава Израиль  
Дата: 23.04.11 15:03
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>На C++ не писал очень давно, так что извините, если что.

Q>
Q>#include <cstdlib>
Q>#include <iostream>
Q>#include <stdexcept>

Q>#define _USE_MATH_DEFINES
Q>#include <math.h>

Q>namespace
Q>{
Q>    double my_sin(double φ)
Q>    {
Q>        if (::rand() % 2 == 1)
Q>            throw std::runtime_error("Some failure.");
Q>        else
Q>            return ::sin(φ);
Q>    }
Q>}

Q>int main(int argc, char const* argv[])
Q>{
Q>    double const latitude = 37.0;
Q>    double const radiansPerDegree = M_PI / 180.0;
Q>    double const φ = latitude * radiansPerDegree;
Q>    double y;
Q>    try
Q>    {
Q>        double const sin_φ = my_sin(φ);
Q>        y = 0.5 * ::log((1.0 + sin_φ) / (1.0 - sin_φ));
Q>    }
Q>    catch (std::runtime_error const&)
Q>    {
Q>    }
    
Q>    std::cout << y << std::endl;

Q>    return 0;
Q>}
Q>


Ну так инициализируй y перед использованием, особенно в таких случаях,

ну или так:

catch (std::runtime_error const&)
{
   y = some_fake_val;
}

ты же для чего-то ловишь исклучение.
Спасибо за внимание
Re[9]: C#: const для переменных, pattern-matching, ...
От: Слава Израиль  
Дата: 23.04.11 15:24
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Lloyd, Вы писали:


L>>Ну вот и не усугубляйте. Добавление фичи в язык — проблема сложная не технически, а концептуально. Нужно чтобы фича хорошо "легла" на язык, чтобы грамотно состыковалась с остальными фичами. Путем выставления потрохов компилятора наружу и разрешения всем и каждому менять синтаксис, эта проблема не решается.


Z>Ситуация очень похожа на ситуацию с var в C#. Было огромное количество холиваров, по поводу опасности его использования. На рсдн в частности. Но был один интересный факт, все кто, яро отстаивал их опасность ни разу их не использовал в полной мере и эту опасность все выводили путем логических построений. Эти построения для выглядят очень убедительно. В результате мир C# раскололся на два лагеря, тех кто юзал var и не ощущал страшных последствий и тех, кто не юзал и бодро поддерживал теорию о его крайней опасности для читабельности и понимания кода.


Z>Интересно было наблюдать, как некоторые противники var, в следующем холиваре становятся его сторонниками (просто, за это время, они поели устриц). Буквально вчера была невиртуальная дискуссия с С++-ником переходящим на шарп. Он очень скептически относился к этому кейворду, я сразу вспомнил эти холивары с 2008 года.


У C++ — ников появилось auto — и он им нравится.
Спасибо за внимание
Re[2]: C++ операция запятая
От: Слава Израиль  
Дата: 23.04.11 15:31
Оценка: +2
Здравствуйте, alpha21264, Вы писали:


A>А еще:

A>0) нельзя использовать русские буквы в именах переменных и функций

А это зачем? сделать 1С из С++ ?
Спасибо за внимание
Re[5]: C++, неявное преобразование signed <-> unsigned
От: igna Россия  
Дата: 23.04.11 15:54
Оценка:
Здравствуйте, Abyx, Вы писали:

A>поменяйте уровень по умолчанию


Тогда компилятор начинает выдавать всякую ерунду.
Re[4]: C++ невозможно отличить создание временнoгo обьекта о
От: igna Россия  
Дата: 23.04.11 15:57
Оценка:
Здравствуйте, Слава, Вы писали:

С>Да, но тут под капотом ещё и вызов деструктора. Кода весь код свой — можно жить, а когда чужой разбираешь?


Вызов деструктора здесь есть назависимо от того, является ли B конструктором или функцией возвращающей объект.
Re[6]: C++, неявное преобразование signed <-> unsigned
От: Слава Израиль  
Дата: 23.04.11 16:19
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Abyx, Вы писали:


A>>поменяйте уровень по умолчанию


I>Тогда компилятор начинает выдавать всякую ерунду.


Это не ерунда, а трудно вылавливаемые баги в будующем. У нас по умолчанию W4 и работаем без варнингов.
Спасибо за внимание
Re[5]: C++ невозможно отличить создание временнoгo обьекта о
От: Слава Израиль  
Дата: 23.04.11 16:20
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Слава, Вы писали:


С>>Да, но тут под капотом ещё и вызов деструктора. Кода весь код свой — можно жить, а когда чужой разбираешь?


I>Вызов деструктора здесь есть назависимо от того, является ли B конструктором или функцией возвращающей объект.


Точно
Спасибо за внимание
Re[6]: C++, неявное преобразование signed <-> unsigned
От: Abyx Россия  
Дата: 23.04.11 16:23
Оценка:
Здравствуйте, igna, Вы писали:

I>Тогда компилятор начинает выдавать всякую ерунду.


значит ваш код плохой.

код должен нормально компилиться c /W4 — стандартная библиотка компилится с /W4, большинство либ буста тоже.
если либа не компилится с /W4, используйте #pragma warning,
если ваш код не компилится с /W4 — правьте ваш код.
In Zen We Trust
Re[3]: C++ операция запятая
От: alpha21264 СССР  
Дата: 23.04.11 16:26
Оценка:
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, alpha21264, Вы писали:



A>>А еще:

A>>0) нельзя использовать русские буквы в именах переменных и функций

С>А это зачем? сделать 1С из С++ ?


Ложная связка. Java по твоему 1С?

Течёт вода Кубань-реки куда велят большевики.
Re[4]: C++ операция запятая
От: Слава Израиль  
Дата: 23.04.11 16:48
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Здравствуйте, Слава, Вы писали:


С>>Здравствуйте, alpha21264, Вы писали:



A>>>А еще:

A>>>0) нельзя использовать русские буквы в именах переменных и функций

С>>А это зачем? сделать 1С из С++ ?


A>Ложная связка. Java по твоему 1С?


Разве кто-то этим пользуется?
Спасибо за внимание
Re[25]: The variable is being used without being initialized
От: Qbit86 Кипр
Дата: 23.04.11 17:25
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Каким образом statement может что-то возвращать?


a return что, не statement?

Q>>Ты просто скрыл недостижимую константность внутри. Снаружи всё константное, но внутри по прежнему программист может «вклиниться» в момент, где какая-то переменная уже создана, но ещё не инициализирована.


L>Каким образом?


Да вот тем, который ты же показал
Автор: Lloyd
Дата: 23.04.11
:
L>
const double y = ((Func<double>) (() => 
{
    double y;
    try
    {
        double const sin_φ = my_sin(φ);
        y = 0.5 * ::log((1.0 + sin_φ) / (1.0 - sin_φ));
    }
    catch (std::runtime_error const&)
    {
    }
    return y;
}))();

Внутренняя «double y» у тебя не константа, и какое-то время пребывает в неинициализированном состоянии. Во, ещё один эксплоит придумал, даже без исключений. Предположим, у тебя рассчёт производится в сторонней библиотеке:
#include <iostream>

#define _USE_MATH_DEFINES
#include <math.h>

namespace third_party
{
    void compute(double sin_φ, double& y)
    {
        y = 0.5 * ::log((1.0 + sin_φ) / (1.0 - sin_φ));
    }
}

int main(int argc, char const* argv[])
{
    double const latitude = 37.0;
    double const radiansPerDegree = M_PI / 180.0;
    double const φ = latitude * radiansPerDegree;
    double const y = [=]() -> double
    {
        double y_local;
        double const sin_φ = ::sin(φ);
        third_party::compute(sin_φ, y_local);
        return y_local;
    }();
    std::cout << y << std::endl;    

    return 0;
}

И всё бы ничего, но в один прекрасный день разработчики сторонней библиотеки изменили код:
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#: Ограничение области видимости локальной переменно
От: Qbit86 Кипр
Дата: 23.04.11 17:28
Оценка:
Здравствуйте, Lloyd, Вы писали:

C>>Достаточно изменить немного семантику const-переменных. Они должны быть константными не с создания, а с первого присваивания.

L>Надеюсь теперь Qbit86-таки согласится, что это возможно. :)

В Джаве — да :)
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: C# NotNullable типов
От: Qbit86 Кипр
Дата: 23.04.11 17:33
Оценка:
Здравствуйте, Undying, Вы писали:

WH>>Причем чтобы достать оттуда значение нужно явно проверить, что там что-то есть.

U>Зачем для этого вводить кошмарный Option?

Это идиома, она везде есть, чем C# хуже? (Да, как минимум тем, что в нём с этим Option'ом паттерн-матчить не так удобно, как в нормальных языках.)
Option можно трактовать как коллекцию, состояющую из нуля или одного элемента. Преполезнейшая штука.
Про паттерн try-get в C# слышал? Так вот, он нахрен не нужен, если б сразу Option<T> использовали как, опять же, в библиотеках нормальных языков.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: C# NotNullable типов
От: Undying Россия  
Дата: 23.04.11 17:35
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Про паттерн try-get в C# слышал? Так вот, он нахрен не нужен, если б сразу Option<T> использовали как, опять же, в библиотеках нормальных языков.


Что такое паттерн try-get?
Re[6]: Tester-Doer
От: Qbit86 Кипр
Дата: 23.04.11 17:40
Оценка: +1
Здравствуйте, Undying, Вы писали:

U>Что такое паттерн try-get?


Я название исказил. В «FDG» это называется Tester-Doer Pattern. Это когда к методу Parse, бросающему исключение, добавляют метод TryParse с мерзкими out-параметрами и возвращаемым bool'ом. Или когда в ассоциативном контейнере наряду с индексатором, бросающим исключение *NotFound есть метод TryGeValue с упомянутым out-параметром и возвращающим bool. Вот это костыли так костыли. Уж лучше из таких методов возвращать IEnumerable<Result>, всегда состоящий из нуля или одного элемента (если религия не позволяет идиоматичный Option<Result> использовать).
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Unicode в идентификаторах
От: Qbit86 Кипр
Дата: 23.04.11 17:45
Оценка: 1 (1) +1
Здравствуйте, Слава, Вы писали:

A>>0) нельзя использовать русские буквы в именах переменных и функций

С>А это зачем? сделать 1С из С++ ?

Русские буквы, конечно, сурово. Но греческие я бы с удовольствием использовал.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: C++
От: Qbit86 Кипр
Дата: 23.04.11 17:49
Оценка:
Здравствуйте, 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
От: WolfHound  
Дата: 23.04.11 18:17
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>А что, было бы неплохо. И уже для имитации императивных конструкций добавлять сахар, который позволит вместо вложенной структуры байндингов использовать линейную последовательность «инструкций» с «присваиваниями»... Постойте-ка, где-то я это уже видел!

В немерле?
Причем весь сахар макросами сделан.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.