Почему не shared_ptr & lt; A & gt; неявное преобразование в shared_ptr & lt; A const & gt ;?

Я пытался представить некоторые const правильность (на самом деле функциональные парадигмы) к некоторому новому коду и обнаружил, что я не могу передать std::shared_ptr<A> к функции, которая ожидает std::shared_ptr<A const>, Обратите внимание, что я не хочу бросать далеко constness, но представьте его, что законно с указателями.

Есть ли способ обойти это? Я не нашел функции-члена для этого.


Точная ошибка, произнесенная g ++ 4.6.1:

error: no matching function for call to ‘foo(std::shared_ptr<A>)’
note: candidate is:
note: template<class T> std::shared_ptr<_Tp> foo(std::shared_ptr<const _Tp>)

10

Решение

Проблема в вашем случае не в возможных конверсиях из / в разные std::shared_ptr, но больше относится к тому, как вывод типа работает для шаблонных функций.

Когда компилятор пытается сопоставить вызов функции с шаблоном, он примет только точный совпадает, то есть нет преобразования типов вообще. В этом случае ваша функция принимает std::shared_ptr<const T>и абонент имеет std::shared_ptr<U> где U не является const, Потому что матч не точный, он откажется от шаблона и выберет следующего кандидата на перегрузку.

Простые обходные пути: полностью избегайте вывода типов и предоставьте аргумент шаблона:

std::shared_ptr<A> p;
foo<A>(p);             // will use the templated shared_ptr conversion

Или выполните преобразование самостоятельно:

foo(std::shared_ptr<const A>(p));
10

Другие решения

Других решений пока нет …