C++: Хроники Дурки🚑
301 subscribers
2 photos
16 links
Очень люблю C++, но это скорее уже стокгольмский синдром.
Постоянно нахожу способы стрельнуть себе в ногу.
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Первым постом в этом канале станет тот, с которого зародилось название канала.

Долгие разборы "военного синуса" привели меня к квинтессенции проблем, после которых я сумел сконструировать несколько абсолютно отвратительных примеров выстрелов себе в ногу.



#include <iostream>

#include <cmath>
double sin(std::string x) { return 1.5; }

int main() {
std::cout << "string: " << std::sin(std::string{"0.5"}) << std::endl;
}



Вот такой код, очевидно, не скомпилируется.


<source>:7:40: error: no matching function for call to 'sin(std::string)'


Что логично. Мы, конечно, объявили синус от строки, но в глобальном пространстве имен. А вызываем std::sin из пространства имен std, и там такого синуса, очевидно, нет.

Но давайте поменяем местами объявление синуса и заголовок cmath. (можем считать, что у нас есть какой-то локальный заголовок, куда такое объявление просочилось)


#include <iostream>

double sin(std::string x) { return 1.5; }
#include <cmath>

int main() {
std::cout << "string: " << std::sin(std::string{"0.5"}) << std::endl;
}



Угадайте что? Правильно: скомпилируется!


Program returned: 0
string: 1.5


А все почему? Правильно, потому что в заголовке cmath (во многих реализациях на linux) есть вот такая строчка:


using ::sin;


Будьте осторожны. Она там такая не одна.
😱5🤯3🔥2👍1