бага в 8м визуальнике?
От: Sni4ok  
Дата: 25.10.06 12:26
Оценка: 2 (1)
void foo(double); // 1
void foo(char*);  // 2

int main(){
foo(false); //*
foo(true); //**
bool b = false;
foo(b); //***
}


в случае (**) и (***) выбирается функция 1
в случае (*) выдаёт ошибку, что не может выбрать перегруженную функцию
Re: бага в 8м визуальнике?
От: Aleksey Pashko Украина about:blank
Дата: 25.10.06 12:51
Оценка:
Здравствуйте, Sni4ok, Вы писали:


S>
S>void foo(double); // 1
S>void foo(char*);  // 2

S>int main(){
S>foo(false); //*
S>foo(true); //**
S>bool b = false;
S>foo(b); //***
S>}
S>


S>в случае (**) и (***) выбирается функция 1

S>в случае (*) выдаёт ошибку, что не может выбрать перегруженную функцию

(**) — вроде всё понятно...
(***) — foo((bool)0) — неявно приводится к double
(*) — нулевой указатель или double(0)?! вот те и UB
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: бага в 8м визуальнике?
От: Sni4ok  
Дата: 25.10.06 12:55
Оценка:
Здравствуйте, Aleksey Pashko, Вы писали:

поведение в ** и *** случае соотвествует стандарту,
но вот с какой нафиг радости false неявно приводится к поинтеру?
false это не NULL же.
Re: бага в 8м визуальнике?
От: Jax Россия  
Дата: 25.10.06 12:57
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>в случае (**) и (***) выбирается функция 1

S>в случае (*) выдаёт ошибку, что не может выбрать перегруженную функцию

Насколько я понимаю, bool может неявно преобразовать в указатель, т.е. получается следующие:

* Передается ноль, компилятор не знает что выбрать, поскольку нулевой указатель тоже может быть.
** Единица, однозначно выбирается 1 функция
*** Выбирается 1 функция, поскольку переменная не имеет тип char*.
Re[3]: бага в 8м визуальнике?
От: Aleksey Pashko Украина about:blank
Дата: 25.10.06 13:11
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Aleksey Pashko, Вы писали:


S>поведение в ** и *** случае соотвествует стандарту,

S>но вот с какой нафиг радости false неявно приводится к поинтеру?
S>false это не NULL же.

насколько я знаю NULL задефайнин как 0, false в итоге тоже станет 0... Почему бы и нет?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: бага в 8м визуальнике?
От: Sni4ok  
Дата: 25.10.06 13:26
Оценка:
Здравствуйте, Aleksey Pashko, Вы писали:

AP>насколько я знаю NULL задефайнин как 0, false в итоге тоже станет 0... Почему бы и нет?


бага в компиляторе то остаётся, это null pointer может конверится к bool(false), но я нигде в стандарте не нашёл упоминание о том, что bool(false) да и вообще интегральный_тип() может неявно конвертироваться в null pointer.
Re[3]: бага в 8м визуальнике?
От: Lorenzo_LAMAS  
Дата: 25.10.06 13:45
Оценка:
По той простой причине, по какой 0 будучи целым приводится к указателю — false тоже является null-pointer-expression.
Of course, the code must be complete enough to compile and link.
Re[5]: бага в 8м визуальнике?
От: Lorenzo_LAMAS  
Дата: 25.10.06 13:49
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Aleksey Pashko, Вы писали:


AP>>насколько я знаю NULL задефайнин как 0, false в итоге тоже станет 0... Почему бы и нет?


S>бага в компиляторе то остаётся, это null pointer может конверится к bool(false), но я нигде в стандарте не нашёл упоминание о том, что bool(false) да и вообще интегральный_тип() может неявно конвертироваться в null pointer.


Плохо искал. Смотри для начала 4.10, потом 5.19 ну и какие типы считаются интегральными.
Никаких багов в компиляторе в данном случае нет.
Of course, the code must be complete enough to compile and link.
Re: бага в 8м визуальнике?
От: StrSet  
Дата: 25.10.06 13:52
Оценка:
Здравствуйте, Sni4ok, Вы писали:


S>
S>void foo(double); // 1
S>void foo(char*);  // 2

S>int main(){
S>foo(false); //*
S>foo(true); //**
S>bool b = false;
S>foo(b); //***
S>}
S>


S>в случае (*) выдаёт ошибку, что не может выбрать перегруженную функцию

1. 0 — есть int, а более точно — 0 это есть литеральная константа
2. А вообще лучше всего избегать перегрузки по численным типам и указателям, если имеется такая возможность.
т.е. в случае с

foo (false);


нужно вероятно что-то похожее на

foo(static_cast<string*>(false));
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: бага в 8м визуальнике?
От: Аноним  
Дата: 25.10.06 15:55
Оценка:
L_L>По той простой причине, по какой 0 будучи целым приводится к указателю — false тоже является null-pointer-expression.

Не пугайте меня, что, все целые могут неявно приводиться к указателю?

Это только литерал "0" может неявно приводиться к указателю.
И именно литерал,
const int i = 0;
i неявно к указателю не приводится.
Re[5]: бага в 8м визуальнике?
От: shank  
Дата: 26.10.06 13:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не пугайте меня, что, все целые могут неявно приводиться к указателю?


А>Это только литерал "0" может неявно приводиться к указателю.

А>И именно литерал,
А>const int i = 0;
А>i неявно к указателю не приводится.
А ты попробуй прежде чем постить.
int main()
{
    const int i = 0;
    void* pv = i; // ok
}
Re[6]: бага в 8м визуальнике?
От: Аноним  
Дата: 26.10.06 14:20
Оценка:
А>>Не пугайте меня, что, все целые могут неявно приводиться к указателю?

А>>Это только литерал "0" может неявно приводиться к указателю.

А>>И именно литерал,
А>>const int i = 0;
А>>i неявно к указателю не приводится.
S>А ты попробуй прежде чем постить.
S>
S>int main()
S>{
S>    const int i = 0;
S>    void* pv = i; // ok
S>}
S>


Гм, даже comeau проглотил ...
Но, вроде, так быть всё равно не должно ...
Re[7]: бага в 8м визуальнике?
От: Lorenzo_LAMAS  
Дата: 27.10.06 11:21
Оценка:
А>Гм, даже comeau проглотил ...
А>Но, вроде, так быть всё равно не должно ...

Вроде ссылки на стандарт дал.

http://rsdn.ru/Forum/Message.aspx?mid=2181960&amp;only=1
Автор: Lorenzo_LAMAS
Дата: 25.10.06
Of course, the code must be complete enough to compile and link.
Re[7]: бага в 8м визуальнике?
От: alexeiz  
Дата: 29.10.06 07:15
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>
S>>int main()
S>>{
S>>    const int i = 0;
S>>    void* pv = i; // ok
S>>}
S>>


А>Гм, даже comeau проглотил ...

А>Но, вроде, так быть всё равно не должно ...

Вот так не пройдёт:
int i = 0;
void * p = i;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.