Re: [терминология] перегрузка
От: Николай Ивченков  
Дата: 20.11.09 12:49
Оценка: 7 (1)
Alexander G:

AG>Почему перегрузкой метода foo называется случай, когда таких методов более двух, а перегрузкой оператора + для класса называется даже единственное объявление этого оператора?


Перегрузка оператора и перегрузка функции — разные вещи. Объявляя операторную функцию operator+, ты вводишь новую возможную интерпретацию для выражения вида
+ cast-expression или
additive-expression + multiplicative-expression.

А перегрузка функции имеет место в том случае, если две функции с одинаковым именем объявлены в одном scope:

"When two or more different declarations are specified for a single name in the same scope, that name is said to be overloaded." (см. 13/1)
Re[2]: [терминология] перегрузка
От: Caracrist https://1pwd.org/
Дата: 20.11.09 12:55
Оценка: -1
Здравствуйте, Николай Ивченков, Вы писали:

НИ>Alexander G:


AG>>Почему перегрузкой метода foo называется случай, когда таких методов более двух, а перегрузкой оператора + для класса называется даже единственное объявление этого оператора?


НИ>Перегрузка оператора и перегрузка функции — разные вещи. Объявляя операторную функцию operator+, ты вводишь новую возможную интерпретацию для выражения вида


Так речь то вся идёт о том, что в некоторых случаях вводится первая и единственная возможная интерпретация...
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: [терминология] перегрузка
От: Николай Ивченков  
Дата: 20.11.09 13:14
Оценка:
Caracrist:

AG>>>Почему перегрузкой метода foo называется случай, когда таких методов более двух, а перегрузкой оператора + для класса называется даже единственное объявление этого оператора?


НИ>>Перегрузка оператора и перегрузка функции — разные вещи. Объявляя операторную функцию operator+, ты вводишь новую возможную интерпретацию для выражения вида


C>Так речь то вся идёт о том, что в некоторых случаях вводится первая и единственная возможная интерпретация...


В каких случаях?
Re[2]: [терминология] перегрузка
От: Lorenzo_LAMAS  
Дата: 20.11.09 16:13
Оценка:
НИ>А перегрузка функции имеет место в том случае, если две функции с одинаковым именем объявлены в одном scope:

НИ>"When two or more different declarations are specified for a single name in the same scope, that name is said to be overloaded." (см. 13/1)


При этом понятие "имя" в самом начале главы 3 определяется так

4 A name is a use of an identifier (2.11), operator-function-id (13.5), literal-operator-id (13.5.8), conversionfunction-
id (12.3.2), or template-id (14.3) that denotes an entity or label (6.6.4, 6.1).


НИ>Перегрузка оператора и перегрузка функции — разные вещи.

Так что не надо заострять внимание на том, что разная.
Of course, the code must be complete enough to compile and link.
Re[3]: [терминология] перегрузка
От: Николай Ивченков  
Дата: 20.11.09 17:46
Оценка: +1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

НИ>>А перегрузка функции имеет место в том случае, если две функции с одинаковым именем объявлены в одном scope:


НИ>>"When two or more different declarations are specified for a single name in the same scope, that name is said to be overloaded." (см. 13/1)


L_L>При этом понятие "имя" в самом начале главы 3 определяется так

L_L>

L_L>4 A name is a use of an identifier (2.11), operator-function-id (13.5), literal-operator-id (13.5.8), conversionfunction-
L_L>id (12.3.2), or template-id (14.3) that denotes an entity or label (6.6.4, 6.1).


НИ>>Перегрузка оператора и перегрузка функции — разные вещи.

L_L>Так что не надо заострять внимание на том, что разная.

"Надо, Федя. Надо" (c) Шурик.
Встроенным операторам не соответствуют никакие функции. Есть лишь набор псевдо-функций, описанных в 13.6, которые могут рассматриваться только в целях operator overload resolution и только при определённых условиях. В частности, для выражения 1+2 никаких кандидатов не определяется, здесь + сразу же трактуется как встроенный оператор в соответствии с 13.3.1.2/1.
Re[4]: [терминология] перегрузка
От: Caracrist https://1pwd.org/
Дата: 20.11.09 18:07
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>Caracrist:


AG>>>>Почему перегрузкой метода foo называется случай, когда таких методов более двух, а перегрузкой оператора + для класса называется даже единственное объявление этого оператора?


НИ>>>Перегрузка оператора и перегрузка функции — разные вещи. Объявляя операторную функцию operator+, ты вводишь новую возможную интерпретацию для выражения вида


C>>Так речь то вся идёт о том, что в некоторых случаях вводится первая и единственная возможная интерпретация...


НИ>В каких случаях?




class A
{
int i;
};

A a,b;
a = b + a;

какая тут интерпретация?
--------

class A
{
int i;
A& operator + (const A&);
};

A a,b;
a = b + a;

И чего мы тут переопределили?
~~~~~
~lol~~
~~~ Single Password Solution
Re[5]: [терминология] перегрузка
От: Николай Ивченков  
Дата: 20.11.09 18:46
Оценка: +1
Caracrist:

C>
class A
{
int i;
A& operator + (const A&);
};

A a,b;
a = b + a;


ISO/IEC 24765:2008 (Systems and software engineering — Vocabulary):

overload. To assign an operator, identifier, or literal more than one meaning, depending upon the data types associated with it at any given time during program execution

Ты ввёл новое значение для оператора сложения — вот она и перегрузка. Конкретная интерпретация оператора сложения зависит от типов его операндов.
Re[6]: [терминология] перегрузка
От: Caracrist https://1pwd.org/
Дата: 20.11.09 20:12
Оценка: :)
Здравствуйте, Николай Ивченков, Вы писали:

НИ>ISO/IEC 24765:2008 (Systems and software engineering — Vocabulary):

НИ>

overload. To assign an operator, identifier, or literal more than one meaning, depending upon the data types associated with it at any given time during program execution

НИ>Ты ввёл новое значение для оператора сложения — вот она и перегрузка. Конкретная интерпретация оператора сложения зависит от типов его операндов.

А вот это уже озвучил jazzer. С этой формулировкой я согласен
~~~~~
~lol~~
~~~ Single Password Solution
Re[7]: [терминология] перегрузка
От: Николай Ивченков  
Дата: 20.11.09 21:04
Оценка: +1
Caracrist:

НИ>>Ты ввёл новое значение для оператора сложения — вот она и перегрузка. Конкретная интерпретация оператора сложения зависит от типов его операндов.


C>А вот это уже озвучил jazzer.


Насколько я понял, он решил свести перегрузку операторов к перегрузке операторных функций. Это неверный подход.
Re[8]: [терминология] перегрузка
От: igna Россия  
Дата: 21.11.09 15:17
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Там слишком глубокое синтаксическое различие: x.f ищется исключительно в области видимости класса, тогда как f(x) — во всех подходящих пространствах имён, вплоть до ::


Помещаем все в класс:

class A {
    struct X {};

    void f(X);

    struct Y {};

    void f(Y);
};



class A {
    struct X {
        void f();
    };

    struct Y {
        void f();
    };
};


"Глубокое синтаксическое различие" превратилось в "мелкое", тем не менее в первом случае имеем перегрузку, во втором — нет.
Re[9]: [терминология] перегрузка
От: Кодт Россия  
Дата: 22.11.09 19:08
Оценка:
Здравствуйте, igna, Вы писали:

I>"Глубокое синтаксическое различие" превратилось в "мелкое", тем не менее в первом случае имеем перегрузку, во втором — нет.


Ничто никуда не превратилось, поскольку "различие" было между свободными функциями и функциями-членами.
А у тебя в обоих случаях — функции-члены.
Перекуём баги на фичи!
Re: А вот не пофиг ли?
От: Erop Россия  
Дата: 22.11.09 19:30
Оценка: +1 -1
Здравствуйте, Alexander G, Вы писали:

AG>Почему перегрузкой метода foo называется случай, когда таких методов более двух, а перегрузкой оператора + для класса называется даже единственное объявление этого оператора?


IMHO, для успешной разработки и поддержки ПО на С++ это не имеет никакого значения...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: [терминология] перегрузка
От: igna Россия  
Дата: 23.11.09 06:56
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А у тебя в обоих случаях — функции-члены.


Пусть так. Тем не менее, по какой такой логике имеем перегрузку здесь:


class A {
    struct X {};

    void f(X);

    struct Y {};

    void f(Y);
};


Но не здесь?:

class A {
    struct X {
        void f();
    };

    struct Y {
        void f();
    };
};
Re[2]: А вот не пофиг ли?
От: igna Россия  
Дата: 23.11.09 07:01
Оценка:
Здравствуйте, Erop, Вы писали:

E>IMHO, для успешной разработки и поддержки ПО на С++ это не имеет никакого значения...


А терминология вообще имеет значение?
Re[3]: [терминология] перегрузка
От: vdimas Россия  
Дата: 23.11.09 08:24
Оценка: -1
Здравствуйте, igna, Вы писали:

I>Вопрос риторический и ответ разумеется ясен, но нет никакого глубокого смысла в том, что определение operator+ называется перегрузкой, а вышеприведенная ситуация нет.


Наверно дело в области видимости еще, которая является частью сигнатуры ф-ии. Для глобального оператора + мы перегружаем его таким же глобальным вариантом.
Re[4]: [терминология] перегрузка
От: igna Россия  
Дата: 23.11.09 09:38
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Наверно дело в области видимости еще, которая является частью сигнатуры ф-ии. Для глобального оператора + мы перегружаем его таким же глобальным вариантом.


А чем дело здесь
Автор: igna
Дата: 23.11.09
?
Re[11]: [терминология] перегрузка
От: Кодт Россия  
Дата: 23.11.09 11:08
Оценка: 6 (1)
Здравствуйте, igna, Вы писали:

I>Пусть так. Тем не менее, по какой такой логике имеем перегрузку здесь:

I>
I>class A {
I>    struct X {};

I>    void f(X);

I>    struct Y {};

I>    void f(Y);
I>};
I>

Здесь у выражения a.f(xy) область поиска f — члены класса A, что определяется из типа выражения a. И мы встречаем две одноимённые функции.

I>Но не здесь?:

I>
I>class A {
I>    struct X {
I>        void f();
I>    };

I>    struct Y {
I>        void f();
I>    };
I>};
I>

А здесь у выражения xy.f() область поиска f — либо члены класса X, либо члены класса Y. Но не одновременно.

Логика такая, что при замыкании объект.член компилятор всегда сперва выводит тип объекта и сужает поле зрения для поиска членов.
Иначе можно было бы делать вот такие чудеса
struct X {};
struct Y { Y(X); void f(); };
void g(Y);

X x;
g(x); // законное поведение: g(Y(x)), т.к. есть неявное приведение X к Y
x.f(); // внезапно, Y(x).f(), по той же самой причине

Ничего не мешает тебе сделать язык с этой логикой, но это будет уже не тот С++, который мы знаем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[11]: [терминология] перегрузка
От: Николай Ивченков  
Дата: 23.11.09 11:39
Оценка: 3 (1)
igna:

I>Тем не менее, по какой такой логике имеем перегрузку здесь:


I>
class A {
    struct X {};

    void f(X);

    struct Y {};

    void f(Y);
};


I>Но не здесь?:


I>
class A {
    struct X {
        void f();
    };

    struct Y {
        void f();
    };
};

В первом случае функции находятся в одном scope, а во втором — нет.

// 1)
&A::f;    // ill-formed, здесь посредством name lookup находятся обе A::f

// 2)
&A::X::f; // well-formed, здесь посредством name lookup находится только A::X::f
Re[12]: [терминология] перегрузка
От: Николай Ивченков  
Дата: 23.11.09 11:40
Оценка: :))
Кодт:

К>Иначе можно было бы делать вот такие чудеса

К>
struct X {};
struct Y { Y(X); void f(); };
void g(Y);

X x;
g(x); // законное поведение: g(Y(x)), т.к. есть неявное приведение X к Y
x.f(); // внезапно, Y(x).f(), по той же самой причине

Такое преобразование дважды запрещено в 13.3.1/5:

During overload resolution, the implied object argument is indistinguishable from other arguments. The implicit object parameter, however, retains its identity since conversions on the corresponding argument shall obey these additional rules:
— no temporary object can be introduced to hold the argument for the implicit object parameter;
— no user-defined conversions can be applied to achieve a type match with it;
[...]

Re[3]: А вот не пофиг ли?
От: Erop Россия  
Дата: 23.11.09 11:45
Оценка: +1
Здравствуйте, igna, Вы писали:

I>А терминология вообще имеет значение?

Терминология -- это вопрос соглашения. Сейчас, IMHO, проблем с терминологией в обсуждаемом месте нет. Все всех понимают...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.