У меня есть таблица символов, реализованная как std::map
. Для значения нет возможности законно построить экземпляр типа значения с помощью конструктора по умолчанию. Однако, если я не предоставляю конструктор по умолчанию, я получаю ошибку компилятора, и если я сделаю конструктор утвердительным, моя программа скомпилируется просто отлично, но сбой внутри map<K,V>::operator []
, если я попытаюсь использовать его для добавления нового члена.Использование std :: map <K,V> где V не имеет подходящего конструктора по умолчанию
Есть ли способ, которым я могу заставить C++ запретить map[k]
как l-значение во время компиляции (учитывая это как r-значение)?
BTW: Я знаю, что могу вставить карту с помощью Map.insert(map<K,V>::value_type(k,v))
.
Edit: несколько людей предложили решение, сумму изменения типа значения, так что карта может построить один без вызова конструктора по умолчанию. Это точно противоположный результат того, что я хочу, потому что он скрывает ошибку до конца. Если бы я был готов к этому, я мог бы просто удалить утверждение от конструктора. Что я Хочу, чтобы ошибка произошла еще раньше; во время компиляции. Тем не менее, кажется, что нет возможности различать значения r-value и l-value от operator[]
, поэтому кажется, что я не могу сделать, поэтому мне просто придется отказаться от использования всего этого.
Если у вас есть C++ 11 или выше, я рекомендую использовать список инициализаторов: 'm.insert ({k, v});'. Используйте 'V map :: at (K key)' для получения значения, например. 'int val = m.at (" important_value ")' – CJxD