QVariant шарится))), и об этом явно написано в документации "тыц ссылкой", где приведена таблица классов Qt, использующих implicit shared.
Не всему надо верить, на заборе тоже много чего написано
Откройте переменную типа QVariant в отладчике - никаких "своих" счетчиков ссылок она не имеет.
QVariant может хранить практически любой copyable тип данных, и совершенно не догадывается о том какой он, с имплисит шарой или без.
Очень даже "догадывается", см напр флажок is_shared или хотя бы фрагмент кода что выше привел
ViTech. Когда хранимый тип имеет имплисит шару, содержимое не копируется. Причем это почему-то поддерживается самим QVariant'ом (неясно зачем?). Но если, как в стартовом посте, хранимый тип std::vector - то никакой шары нет, и бедняга вектор гоняется туда-сюда всякий раз.
Технических особенностей, почему бы не предоставить доступ к внутреннему содержимому, как, например, для QByteArray, никаких нет. Для std::any имеется std::any_cast< MyType & >.
Из-за отсутствия таких методов, QVariant постоянно использует копирование внутренних данных (fromValue/value), что приводит не редко к существенным потерям производительности.
Это я уже осознал, предлагаю вернуться к теме: как лучше сделать "шареный вариант"?
Сам тип, конечно , достаточно будет заменить на std::any) (но только с С++17).
Но там еще обвязка по динамической работе с типами и регистрации произвольной функциональности (кастование и преобразование типов, фабричные методы, сериализация и определенная пользователем любая другая).
Согласен, QVariant выглядит гораздо солиднее чем легковесный std::any.