допустима ли перегрузка
От: Alexander Pazdnikov  
Дата: 30.09.11 06:35
Оценка:
Здравствуйте, Коллеги.

Не получу ли UB?

enum E;

struct A
{
   A(E e);
   A(bool isSome);
};
Re: допустима ли перегрузка
От: Andrey_spb Россия  
Дата: 30.09.11 06:40
Оценка:
На первый взгляд криминала не вижу.
Re: допустима ли перегрузка
От: _niko_ Россия  
Дата: 30.09.11 06:51
Оценка: 2 (1)
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Здравствуйте, Коллеги.


AP>Не получу ли UB?


AP>
AP>enum E;

AP>struct A
AP>{
AP>   A(E e);
AP>   A(bool isSome);
AP>};
AP>


Нет, с какой стати? типы то разные.

Все ниже перечисленное проглатывается и разруливается
enum E {};
struct B {};
struct C {};

struct A
{
    void func(B * ptr);
    void func(C * ptr);

    void func(B ptr);
    void func(C ptr);

    void func(E e);
    void func(bool isSome);
};


Если компилятор запутается какую функцию вызвать под тот или иной передаваемый аргумент он заругается ещё на этапе сборки.
Re: допустима ли перегрузка
От: okman Беларусь https://searchinform.ru/
Дата: 30.09.11 07:30
Оценка:
Здравствуйте, Alexander Pazdnikov.

С таким подходом можно получить плохо предсказуемое поведение:

enum my_enum
{
    some_value
};

struct my_struct
{
    my_struct(my_enum E) {} // ctor 1
    my_struct(bool B) {}    // ctor 2
};

int main()
{
    my_struct Ms1(some_value); // Будет вызван ctor 1
    my_struct Ms2(false);      // Будет вызван ctor 2
    my_struct Ms3(0);          // Какой конструктор будет вызван ?

    return 0;
}
Re[2]: допустима ли перегрузка
От: okman Беларусь https://searchinform.ru/
Дата: 30.09.11 08:01
Оценка:
Обсуждалось здесь
Автор: Ytz
Дата: 08.04.11
.
Суть вкратце — при выборе перегруженной функции компилятор отдаст предпочтение
функции, использующей встроенный тип (bool в данном случае), чем определенный пользователем.
Re[2]: допустима ли перегрузка
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 30.09.11 08:28
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Alexander Pazdnikov.


O>С таким подходом можно получить плохо предсказуемое поведение:


O>
O>enum my_enum
O>{
O>    some_value
O>};

O>struct my_struct
O>{
O>    my_struct(my_enum E) {} // ctor 1
O>    my_struct(bool B) {}    // ctor 2
O>};

O>int main()
O>{
O>    my_struct Ms1(some_value); // Будет вызван ctor 1
O>    my_struct Ms2(false);      // Будет вызван ctor 2
O>    my_struct Ms3(0);          // Какой конструктор будет вызван ?

O>    return 0;
O>}
O>

Ну тут ты сам себе злобный Буратино.
Sic luceat lux!
Re[3]: допустима ли перегрузка
От: Bell Россия  
Дата: 30.09.11 08:55
Оценка: +1
Здравствуйте, okman, Вы писали:

O>Обсуждалось здесь
Автор: Ytz
Дата: 08.04.11
.

O>Суть вкратце — при выборе перегруженной функции компилятор отдаст предпочтение
O>функции, использующей встроенный тип (bool в данном случае), чем определенный пользователем.

В данном случае компилятору не из чего выбирать — стандартного преобразования int -> enum не существует, так что остается единственный вариант с bool.
Любите книгу — источник знаний (с) М.Горький
Re[4]: допустима ли перегрузка
От: okman Беларусь https://searchinform.ru/
Дата: 30.09.11 09:46
Оценка:
Здравствуйте, Bell, Вы писали:

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


O>>Обсуждалось здесь
Автор: Ytz
Дата: 08.04.11
.

O>>Суть вкратце — при выборе перегруженной функции компилятор отдаст предпочтение
O>>функции, использующей встроенный тип (bool в данном случае), чем определенный пользователем.

B>В данном случае компилятору не из чего выбирать — стандартного преобразования int -> enum не существует, так что остается единственный вариант с bool.


Это лишь частный случай.
Возможны неявные преобразования с другими типами, что в конечном счете где-то да выстрелит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.