Если я сделаю:
uniquePairs.emplace_back("literal garbage data");
Это не кричит на меня.
Потому что не проверяет правильность (выполнение of) такое утверждение .
Реальный вопрос тогда - почему это не так?
Ответ: потому что это обычно много работы . Давайте рассмотрим именно этот случай:
uniquePairs.emplace_back("literal garbage data");
пытается вызвать template< class... Args > reference emplace_back( Args&&... args )
, где Args
- пакет параметров , состоящий из одного типа - const char[21]
. Имейте в виду, что у "c-string literals"
есть различные типы для каждой длины литерала. Это задача № 1 .
задача № 1:
Создание emplace_back
с для всех типов, которые вы вызываете с ним. Это не , что большая работа, но это может сложиться потом.
Успешная реализация указанного шаблона функции приводит к (по определению функции) совершенной пересылке, т. Е. Проблема # 2 .
Задача № 2:
Вызов (создание экземпляра) std::forward
. Это просто повторяет задачу # 1 , но в другом объеме. Не здорово, не ужасно.
Задача № 3:
После того, как мы уже создали (в фоновом режиме, без полного намерения компиляции) некоторые шаблоны функций, теперь нам нужно проверить, если отлично перенаправленные аргументы для emplace_back
могут составить a value_type
вашего std::vector
.
Ваш value_type
равен std::pair<ulong, ulong>
. Очевидно, что const char[21]
не может этого сделать. Теперь ваша IDE может кричать на вас.
Это довольно банальный случай, но обратите внимание, сколько работы нужно было сделать в первую очередь. А теперь представьте, что вы идеально подходите для чего-то другого. Больше аргументов. Больше звонков. Больше фоновых экземпляров.
Фоновый код дезинфицирующих средств не должен прерывать вашу работу. Они также должны (надеюсь) дать вам надежные подсказки в разумные сроки. Эта особенность может быть довольно тривиальной (ваш случай) или очень сложной . Самый простой ответ - просто не пытаться выполнить sh таких задач.
Бонус:
Почему тогда, если вы push_back("literal garbage data")
, IDE обычно кричит на вас?
Поскольку подпись push_back
принимает либо const T&
, либо T&&
для std::vector<T>
. Довольно просто увидеть, что const char[21]
является не a std::pair<ulong, ulong>
(ни конвертируем в один). Инстанцирование не требуется (при условии, что инстанцирование вашего vector
уже было выполнено в фоновом режиме. Если нет, добавьте еще одну проблему в обоих случаях). Не много работы. Легко вычислить, легко предупредить.