Почему QTCreator не предупреждает меня, если emplace_back совершенно неверен? - PullRequest
1 голос
/ 05 февраля 2020

Допустим, у меня есть этот вектор пар чисел:

std::vector<std::pair<ulong, ulong>> uniquePairs;

Если я сделаю:

uniquePairs.emplace_back("literal garbage data");

Это не кричит на меня. Не должно ли что-то кричать на меня, что этот код ужасно, совершенно не так? Никаких предупреждений от линтера нет вообще.

Конечно, когда я go на самом деле не могу скомпилировать с G CC.

, он не может.

1 Ответ

2 голосов
/ 05 февраля 2020

Если я сделаю:

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 уже было выполнено в фоновом режиме. Если нет, добавьте еще одну проблему в обоих случаях). Не много работы. Легко вычислить, легко предупредить.

...