
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 31 32 [33] 34 35 ... 77 78 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#481
,
|
|
Это-то было понятно с самого начала. Непонятно, с чего бы это должно было быть причиной запрета на их перегрузку.
Возможность их перегрузки для пользовательских типов может быть полезна в ряде случаев. Тот факт, что будучи перегруженными, эти операторы будут иметь семантику, отличную от их стандартных форм, во-первых, несложно документируется, во-вторых, и без документирования вполне очевидна. Я склонен считать, что наоборот, стандартные формы этих операторов имеют особенную семантику, что и задокументировано Стандартом. |
Сообщ.
#482
,
|
|
|
Цитата Qraizer @ Я склонен считать, что наоборот, стандартные формы этих операторов имеют особенную семантику Тем более только для типа bool. |
Сообщ.
#483
,
|
|
|
Цитата Qraizer @ Это-то было понятно с самого начала. Непонятно, с чего бы это должно было быть причиной запрета на их перегрузку. Я не говорю, что нужно запретить. Я не понимаю, зачем было изначально разрешать. Обратной дороги уже нет. Как и со спецификациями исключений и многим другим... Цитата Возможность их перегрузки для пользовательских типов может быть полезна в ряде случаев. В каких? Цитата Тот факт, что будучи перегруженными, эти операторы будут иметь семантику, отличную от их стандартных форм А я пытаюсь сказать, что встроенные версии вообще не являются операторами. Цитата Так и есть. Стандартные версии - особая языковая форма, а не оператор. Зачем понадобилось давать возможность "пользователям" создавать еще и оператор с таким же обозначением, как встроенная в язык особая форма - непонятно. Это все-равно, что разрешить перегружать макрос функцией.Я склонен считать, что наоборот, стандартные формы этих операторов имеют особенную семантику Можно разрешить добавлять оператор ; или оператор пробела или operator". А что? Просто "стандартные формы этих операторов" будут иметь "особенную семантику". |
Сообщ.
#484
,
|
|
|
Можно тогда, на всякий случай, определение функции? А там посмотрим. Математическая запись бинарной операции. |
Сообщ.
#485
,
|
|
|
Цитата Masterkent @ Цитата D_KEY @ Математическая запись бинарной операции. Ты можешь внятно растолковать смысл фразы "это описание "операции" && не соответствует bool * bool -> bool"? Составить предложение из букв и прочих символов - не значит написать что-то осмысленное. Если ты не в состоянии что-либо понять, это вовсе не означает, что это что-либо не имеет смысла. Цитирование стандартов не всегда означает понимание лежащих в их основе концепций. Функция, оператор и операция - это, в общем случае, отображения одного множества в другое. Это понятие из математики, но оно справедливо и для программирования, пусть и с некоторыми оговорками для некоторых языков (в данном случае, поскольку мы говорим об элементарных операциях, эти оговорки можно не учитывать). Запись A -> B обозначает отображение множества A в множество B, то есть соответствие каждому из элементов множества A определенному элементу из множества B. A*B обозначает пару элементов множеств A и B соответственно. bool * bool -> bool – обозначает отображение(функцию, операцию, оператор), которое ставит в соответствие паре элементов из множества булевых значений элемент из множества булевых значений. Если в язык встроены ленивые вычисления, а побочных действие нет, то отказ от вычисления второго аргумента логического and абсолютно естественен и по-прежнему соответствует bool * bool -> bool. Если же в язык ленивые вычисления не встроены, но язык предоставляет некоторую специальную языковую конструкцию, которая позволяет откладывать вычисления на тот момент, когда потребуется значение (в принципе, при наличии лямбда функций такая форма имеет очень простую реализацию(но требует или хорошо развитых макросов или введение специальной языковой формы)), то указанное обозначение продолжает иметь силу, правда с некоторыми оговорками. С++ же не имеет ни того, ни другого. Да и не в этом дело. В С++ операции и функции слишком часто используются для своих побочных эффектов, а не только для вычисления значения. Дело не только в "the second operand is not evaluated if the first operand is ...", а в sequence point. Цитата operators can be regrouped according to the usual mathematical rules only where the operators really are associative or commutative . . . Overloaded operators are never assumed to be associative or commutative Цитата A full-expression is an expression that is not a subexpression of another expression … There is a sequence point at the completion of evaluation of each full-expression. Но для рассматриваемых операторов мы имеем: Цитата In the evaluation of each of the expressions a && b a || b a ? b : c a , b using the built-in meaning of the operators in these expressions (5.14, 5.15, 5.16, 5.18), there is a sequence point after the evaluation of the first expression. Это и есть то, что называется особой формой. Данные операции представляют собой специальные выражения, которые рассматриваются особым, отличным от предусмотренного для других выражений, образом. Но, выполняя перегрузку, мы, естественно, убираем эту sequence point: Цитата When one of these operators is overloaded (clause 13) in a valid context, thus designating a user-defined operator function, the expression designates a function invocation, and the operands form an argument list, without an implied sequence point between them Мне кажется нелогично разрешать такую перегрузку. Кроме того, logical AND он и есть logical AND, и смысла ни для каких значений, кроме bool'ов, не имеет. |
Сообщ.
#486
,
|
|
|
Цитата Masterkent @ Цитата D_KEY @ Функция, оператор и операция - это, в общем случае, отображения одного множества в другое. Не в общем случае, а только в определённых разделах математики. В императивных языках программирования функции и операторы могут приводить к изменению состояния программы и не иметь результирующего значения. Мы сейчас говорим о выражениях и встроенных операторах или где? Цитата Или, по-твоему, алгебраические определения - единственно верные и на них нужно молиться? Нет. Молиться на какие-либо определения не стоит. Ни на "алгебраические", ни на указанные в стандартах. Но нужно понимать, откуда идут определенные понятия. И поскольку мы говорим о выражениях и элементарных операциях, то все мною сказанное остается корректным. Цитата Цитата D_KEY @ Мне кажется нелогично разрешать такую перегрузку. А мне так не кажется. Так что ты скажешь относительно sequence point? Цитата Как называется && в стандарте?Цитата D_KEY @ Кроме того, logical AND он и есть logical AND, и смысла ни для каких значений, кроме bool'ов, не имеет. Перегруженный оператор && не обязан вычислять "логическое И". Но, конечно, не обязан. |
Сообщ.
#487
,
|
|
|
Цитата Здесь в полном соответствии со стандартом реализация имеет право вычислить f() во время выполнения программы эээ почему? о_О разве приведенная строка не подпадает под Цитата ? Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false. |
Сообщ.
#488
,
|
|
|
Цитата Masterkent @ Цитата D_KEY @ Мы сейчас говорим о выражениях и встроенных операторах или где? Я ответил на конкретное предложение, где ничего не говорилось про выражения, но говорилось про операторы (без "встроенные"). Я не могу читать твои мысли, а могу только отвечать на то, что ты пишешь. Но сохранять контекст разговора все-таки неплохо бы научится. Цитата очевидно... тоже очевидно. Ну раз очевидно, тогда откуда высказывания о неуместности определений из математики? Цитата Я вообще не понимаю твои рассуждения. Еще разок. Поведение встроенных , && || ?: сильно отличается от поведения остальных операторов, они представляют собой особые языковые формы. Их поведение нельзя имитировать другими языковыми средствами и при их перегрузке нельзя не исказить предусмотренной для них семантики. Цитата Потому, что нельзя создать перегрузку, которая будет сохранять семантику встроенной версии.Скажу, что не вижу никаких доводов, почему отсутствие sequence point между вычислением аргументов операторной функции мешает перегрузке &&. Цитата Здесь в полном соответствии со стандартом реализация имеет право вычислить f() во время выполнения программы Хм... Это несколько меняет дело... Правда в еще более худшую сторону. Неужели С++ настолько непредсказуем с точки зрения стандарта? |
Сообщ.
#489
,
|
|
|
Цитата Masterkent @ Цитата D_KEY @ Еще разок. Поведение встроенных , && || ?: сильно отличается от поведения остальных операторов, они представляют собой особые языковые формы. Их поведение нельзя имитировать другими языковыми средствами и при их перегрузке нельзя не исказить предусмотренной для них семантики. Несколько утверждений и ни одного логического следствия. Так рассуждения не строятся. Извини, не по стандарту. "Следствия" были ранее. Я в очередной раз пытался обосновать свои тезисы о нелогичности перегрузки этих операторов. Интересно, слово "этих" будет понятно? На всякий случай скажу, что под "этими операторами" понимаются && || , ?:. |
![]() |
Сообщ.
#490
,
|
|
Нелогично - перегружать без достаточных на то оснований. Но ещё более нелогично запрещать их перегрузку. Тоже нет достаточных оснований.
|
Сообщ.
#491
,
|
|
|
Flex Ferrum
подскажи пожалуйста как использовать алгоритмы С09 в gcc |
Сообщ.
#492
,
|
|
|
Цитата Большой @ подскажи пожалуйста как использовать алгоритмы С09 в gcc Какие именно? |
Сообщ.
#493
,
|
|
|
ну copy_if например
я глянул вроде бы все есть, но не подключаются, я так думаю нужек ключ для компилятора |
Сообщ.
#494
,
|
|
|
Большой, gcc? Тогда -std=c++0x
|
Сообщ.
#495
,
|
|
|
MyNameIsIgor
так не пашет |