LINUX.ORG.RU

всё-ж ++ не С

 ,


0

3

в плюсах «if (a && b && с ) { stmt }» ни фига не эквивалент «if (a) if (b) if (c) { stmt }».

ps. ушёл пить пиво и думать как быть с такими закидонами, или к чёрту такой язык

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

об этом самом.

ну так это логичное поведение, как еще ты сможешь реализовать функцию, которая принимает два параметра без их вычисления

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от arkhnchul

CL, жаба, перл наприимер.

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

tailgunner ★★★★★
()
Ответ на: комментарий от wota

Думаю, если перегрузить operator int - тоже.

нет, тогда ленивость вычислений останется

при перегрузке operator bool пропадает..не вся и меедленно :-)

MKuznetsov ★★★★★
() автор топика
Ответ на: комментарий от MKuznetsov

при перегрузке operator bool пропадает

~$ cat 1.cpp
#include <iostream>

template<int N>
struct A {
        operator bool() const { std::cout << N << '\n'; return N; }
};

int main() {
        if( A<1>() && A<0>() && A<0>() && A<0>() );
}
~$ g++ 1.cpp
~$ ./a.out 
1
0

прохладная история ;)

wota ★★
()
Ответ на: комментарий от tailgunner

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

речь о

«if (a && b && с ) { stmt }» ни фига не эквивалент «if (a) if (b) if (c) { stmt }»

ака «ленивые вычисления». Если же мы упираемся в «&& может быть перегружен и означать не логическое умножение» - то ой, это просто замечательное решение.

arkhnchul ★★★
()
Ответ на: комментарий от arkhnchul

Если же мы упираемся в «&& может быть перегружен и означать не логическое умножение»

Мы упираемся в то, что перегруженному оператору && всегда нужно 2 аргумента.

ой, это просто замечательное решение.

Предложи свое решение для языка с перегрузкой операций и eager evaluation.

tailgunner ★★★★★
()
Ответ на: комментарий от wota

А ну, естественно, что не совсем реально реализовать short-circuit если && вернёт не bool.

http://ideone.com/Kbz4cu

Тогда утверждение ТС верно. Но такая перегрузка && сродни стрельбы по ногам: семантика нарушается.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)
Ответ на: комментарий от KennyMinigun

не совсем реально реализовать short-circuit если && вернёт не bool

А как реализовать short circuit, если && возвращает bool, но принимает, например, две Cls1&?

tailgunner ★★★★★
()
Ответ на: комментарий от wota

Ждём в следующей версии стандарта С++ возможность перезагрузить эти операторы с сохранением ленивости.

PolarFox ★★★★★
()
Ответ на: комментарий от MKuznetsov

одного раза хватило :)

Ну вот ой, правда. Единственную в своей жизни перегрузку оператора && я пока встретил в книге Майерса. Наверное разумнее всего было бы просто запретить перегружать &&, || и запятую в принципе, но видимо комитет опасается того, что это приведёт к массовым выпиливанием говнофич из языка и образованию в дугу не совместимого с написанным кодом стандарта.

Где хоть нашёл?

KblCb ★★★★★
()
Ответ на: комментарий от PolarFox

Ждём в следующей версии стандарта С++ возможность перезагрузить эти операторы с сохранением ленивости.

А разве это обещают?

Да и плохо себе представляю реализацию этого. Ну и в каждом букваре советуют не перегружать этот оператор. На практике ни разу не сталкивался.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

В метапрограммировании используется из-за низкого приоритета. В бусте, например, найти можно.

Перегрузку запятой? Можно ссылку или хотя бы модуля название?

KblCb ★★★★★
()
Ответ на: комментарий от tailgunner

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

KennyMinigun ★★★★★
()
Ответ на: комментарий от KblCb

Boost.Phoenix если spirit представляется слишком монст и уозным.

Begemoth ★★★★★
()

А кто-то когда-то утверждал, что ++ - это С? ++ намного лучше.

anonymous
()
Ответ на: комментарий от KblCb

Перегрузку запятой? Можно ссылку или хотя бы модуля название?

boost.assign, там даже цитата забавная есть:

There appear to be few practical uses of operator,().

Bjarne Stroustrup, The Design and Evolution of C++

Вроде, в boost.phoenix тоже есть, но ссылку так сразу не дам.

DarkEld3r ★★★★★
()

всё-ж ++ не С

иди стандарт читай.
или тебе звезд по слепоте отсыпали?

anonymous
()
Ответ на: комментарий от PolarFox

Ну если так критичны 3.5 слова, которые в c++ зарезервированы и не монут быть идентификаторами, то да, можно и так сказать.

comp00 ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

НЕ используй спорные конструкции языков, используй лишь те, которые не зависят от компилятора

А что тут зависит от компилятора?

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous

lazy-аргументы можно запилить. В D вроде как есть.

Не знал, забавная фича.

DarkEld3r ★★★★★
()
Ответ на: комментарий от nanoolinux

Я понял, но призываю не использовать языковые конструкции, которые непонятны прграммисту либо работают не так как надо. Вердикт - переписать участочек кода и просто двигаться дальше.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от nanoolinux

Расстрою: мне понятен код, приведенный в начале темы, понятна проблема.

Я бы не потратил ни секунды, увидев что участок кода работает не так как я ожидал, на разборки. Раз так - значит так. Не подходит - значит не подходит. Просто переписал бы иначе. Но это я, профессионал =) шучу

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

НЕ используй спорные конструкции языков, используй лишь те, которые не зависят от компилятора

Перегрузка && зависит от компилятора?

theNamelessOne ★★★★★
()

Никогда и не были. Два отдельных языка.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.