#новичкам
C++17 дал нам замечательную фичу CTAD. Это автоматический вывод шаблонных параметров класса по инициализатору.
Теперь, если вы хотите создать например пару строки и числа, то вместо этого:
std::pair<std::string, int> pair{"Hello there!", 1};Можно писать так:
std::pair pair{"Hello there!", 1};Удобно? Безусловно! Только вот один вопросик есть.
Что будет, если я попытаюсь достать размер строки?
size_t size = pair.first.size();
А будет ошибка
error: request for member 'size' in 'a.std::pair<const char*, int>::first',
which is of non-class type 'const char*'
Пара-то на самом деле не из строки и числа, а из указателя и числа. Но это и правильно. Компилятор не умеет читать мысли, а четко работает с тем, что ему предоставили. В данном случае "Hello there!" действительно преобразуется в тип const char*. Если вы хотите std::string, то нужно явно показать это компилятору:
std::pair pair{std::string("Hello there!"), 1};При более сложном коде могут возникать такие простыни ошибок компиляции, что без бутылки и не разберешься, что там на самом деле происходит.
Поэтому при использовании CTAD нужно тщательно следить за типами аргументов. Классы с не explicit конструкторами могут наделать большую невкусную кучу беспокойства.
Кстати, знаю адептов строгой типизации, которые даже auto не признают. А как вы относитесь к автоматическому выводу типов? Жду ваши мысли в комментах)
Be careful. Stay cool.
#cppcore #cpp17