?

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

нафиг таких работодателей. еще один прикол с преобразованием числа в строку, это попытка передать float в функцию, которая принимает const string&. потому что float сначала преобразуется в char и инициируется интересный конструктор строки.
Настоящие программисты любят языки, устроенные по принципу "вы этого хотели, вот вам".
Настоящие программисты готовы нырять. И к прочим трудностям. А не только ключи подавать :-)
Указатель это фактически число, которое легко преобразуется в int

Такого уровня объяснения я стерпеть не могу.
А как это надо было бы объяснять??? Можно было бы добавить, что для преобразования в строку надо было бы вызвать конструктор string(size_t ...) и компилятор, есесствевнно, это лишнее действие не будет делать, если есть более подходящая сигнатура.
Единственный указатель, который автоматически приводится к целому - нулевой. Приведение к bool делается путем сравнения с нулем соответствующего типа.
Вы совершенно правы в том, что автоматом указатель к целому не приводится. Я заглянул в стандарт и он говорит, что это только фича булевского типа:

4.12 Boolean conversions [conv.bool]
1 An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false any other value is converted to true.

Указатель может автоматически преобразовать в логический тип, но не может преобразоваться в целое.
задумался, как правильно сказать...

указатель это фактически 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.