Я использую smartptrs StD недавно, и я написал массовый код с «shared_ptr», есть некоторые проблемы в моей голове:станд :: shared_ptr головоломка в параметре функции
Там есть два класса:
class base{} class drived: public base{}
, а также имеют две функции, как это:
void fconst(const shared_ptr<classA>& obj){} void f(shared_ptr<classA>& obj){}
и эта функция для тестирования вызова:
void test()
{
std::shared_ptr<drived> obj(std::make_shared<drived>());
f(obj); // this is error in vc++, because type is not compatibility
fconst(obj); // this is ok in vc++
}
Я понимаю f
вызов ошибки, но почему fconst
вызов нормально?
Если использование base*
имеет преимущество: когда функция принимает параметр base*
, вызывающий может передать все дочерние элементы базы в качестве параметра.
и когда используется shared_ptr
, есть ли похожий символ? fconst
Поведение тестового вызова является надежным стандартом?
2. при shared_ptr
передачи в параметрах функции, когда эти использования:
void f(const shaerd_ptr<classA> obj)
void f(const shaerd_ptr<classA>& obj)
void f(shaerd_ptr<classA> obj)
void f(shaerd_ptr<classA>& obj)
благодарит вас за вашу помощь!
EDIT: спасибо ~, и я также есть проблемы с последующим кодом:
недействительным тест()
{
станд :: shared_ptr OBJ (станд :: make_shared()) ;
f (obj); // это ошибка в vC++, потому что тип не совместим
fconst (obj); // это нормально в VC++
// продолжить ..
std::shared_ptr<base> objBase(std::make_shared<base>());
f(objBase); // this is ok, why?
fconst(objBase); // this is ok after your answer
}
Вы не можете привязать ссылку, отличную от константы, к временному, но вы можете привязать ссылку const. –
У меня есть обновленный вопрос, пожалуйста, помогите еще раз, спасибо! ~~ –