avva: (Default)
[personal profile] avva
Будет интересно только программистам, знающим C++.

Небольшая загадка. Предугадайте, что напечатает следующая программа, не запуская ее. Потом проверьте себя, если интересно. Комменты не скрываются.
#include <iostream> #include <map> #include <string> using namespace std; int main() { map<int, string> m; double d = 123456.789; m[0] = d; cout << "m[0]=" << m[0]; return 0; }

Date: 2010-06-27 12:26 pm (UTC)
From: [identity profile] zigmar.livejournal.com
Я сказал бы, что такое не откомпилируется, так как не не определен оператор присвоения для ссылки на стриг и double. Но так как явно вопрос с подвохом и код скомпилируется, то я придумал такую безумную теорию:
Какой-то из конструкторов string-а который принимает size_t или int (кажется, он инициализует пустой стринг такой длинны или резервирует данное кол-во места) почему-то не объявлен как explicit, и с помощью двойного неявного преобразования (разве такое бывает?!) double->int/size_t->string создаст пустой или длинный стринг из пробелов(?), который и поместит в map.

Date: 2010-06-27 12:30 pm (UTC)
From: [identity profile] zigmar.livejournal.com
Хмм, посмотрел документацию, вроде нету такого конструктора, чтоб один int аргумент получал.
http://www.cplusplus.com/reference/string/string/string/
http://www.sgi.com/tech/stl/basic_string.html

Пойду компилировать и смотреть. Блин, а я то думал, что неплохо в тонкостях с++ разбираюсь :)

Date: 2010-06-27 12:36 pm (UTC)
From: [identity profile] zigmar.livejournal.com
Еще одна теория:
Вызывается string& operator= ( char c ) предварительно откромсав double=123456.789 до char=0x40 т.е. символа '@'. Пойду проверять...

Date: 2010-06-27 12:38 pm (UTC)
From: [identity profile] zigmar.livejournal.com
Оказалось верно. ППЦ.

Date: 2010-06-27 02:14 pm (UTC)

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 05:06 pm
Powered by Dreamwidth Studios