?

Log in

No account? Create an account
Нэцкэ

Смешное с RSDN

Собеседование: соискатель наносит ответный удар

Интервьюер (И): Я вижу, что многого Вы не знаете и Вам еще много чему нужно учиться. Некоторые вещи, которые должен знать каждый, явно прошли мимо Вас.
Я (Я): Во-первых, я всю жизнь учусь, во-вторых, все знать невозможно, ну а в-третьих, у каждого свое понимание, что должен знать каждый, а что нет. Уверен, что и Вы не каждый вопрос ответите сходу.
(И) смотрит на меня с интересом.
(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool?
(И): Почему нельзя? Можно!
(Я): Хорошо, язык это позволяет, но делать так не стоит. Почему?
(И)(задумчиво): Неоднозначности тут не возникнет... Вы не правы!
(Я): Хорошо, подумайте над этим. Вопрос на самом деле нуууу очень простой!
Вежливо прощаемся.

Через день звонит мне на трубку.
(И): Здравствуйте, С.А., это Вас беспокоят из фирмы XXX. Мы тут подумали...
Па-па-па-пам! Неужели берут?
(И): Нам кажется, Вы все-таки заблуждаетесь, и никаких препятствий для такой перегрузки нет! Объясните, почему Вы так считаете, что этого делать нельзя?
(Я) (еле сдерживаясь, чтобы не начать кататься от смеха по полу): А Вы меня берете, или нет?
(И): Нет, Вы нам не подходите!
(Я): Тогда подумайте над этим вопросом сами.
Кладу трубку.


перегрузите оба и посмотрите, какой вызовется на const char *
void bar(const std::string &s) { printf("const std::string &\n"); }
void bar(bool b) { printf("bool"); }
...
bar("");


фишка в том, что "" имеет тип char* (const-ы я опустил), т.е. указатель. Указатель это фактически число, которое легко преобразуется в int, а bool — это фактически и есть int, причём это встроенный тип.
А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что.
Tags: , ,

Comments

задумался, как правильно сказать...

указатель это фактически int? -- так лучше?
указатель может быть очень сложной структурой.
http://www.mcst.ru/doc/volkonsky_101110.doc
К слову, описанное есть в железе.
Указатель это все же не int, поскольку указывает на адрес в памяти, где находится структура, на которую он указывает. Это легко проверить, выполнив
========================================
int *ptr = 0;
printf("%d,%d,%d\n",(int)ptr,(int)(ptr+1),(int)ptr+1);
========================================
0,sizeof(int),1

Если не указывать явно преобразование типов, то результат будет другим и зависеть от компилятора и реализации printf. Языки C и C++ по определению не занимаются проверкой типов и по умолчанию используют тип int.