По умолчанию std::queue
основан на std::deque
, который не гарантируется как nothrow-movable . Ни один другой подходящий стандартный контейнер, std::list
; эти правила допускают реализации, которые всегда выделяют как минимум один узел / блок. std::vector
использует копии для перераспределения, когда перемещение может выдать (чтобы гарантировать безопасность исключений), если тип не копируется вообще, и эти два контейнера также не распространяют не копируемость из своего типа элемента, но просто потерпите неудачу, если попытаетесь. (Можно сказать, что последнее является дефектом в стандарте; ожидания такого распространения продолжают расти.)
Обратите внимание, что и libstdc ++, и libc ++ do делают эти два контейнера не перемещаемыми ( начиная с версии 9 в каждом случае), что является допустимым расширением, но STL MSVC этого не делает.
Вы по-прежнему можете использовать std::vector<QNC> v(3);
; конструктор «знает», что re распределение никогда не требуется. Или вы можете предоставить оболочку ( например , класс, производный от std::queue
), который не копируется или не может быть перемещен; первый исключит безопасность исключений std::vector
, а второй вызовет std::terminate
, если перемещение базового контейнера вызывает throw.