2015-01-23 2 views
0

Я пытаюсь понять синтаксис boost::scoped_ptr. Давайте определим и записать в стандартный вывод scoped_ptr указатель, а также значение, которое она указывает на:Что такое значение boost :: scoped_ptr pointer?

#include <boost/scoped_ptr.hpp> 
#include <iostream> 

int main() 
{ 
    boost::scoped_ptr<int> p{new int{1}}; 

    std::cout << p.get() << '\n'; // ok 
    std::cout << p << '\n';  // error 


    std::cout << *p.get() << '\n'; // ok 
    std::cout << *p << '\n';  // ok. *p==*p.get() 
} 

вопрос. Почему *p.get()==*p и еще std::cout << p << '\n'; не компилируются?

Я работаю on g++ -std=c++11 -O2 -Wall -pedantic.

+0

Вопрос 1, как имеющие: 'INT * р;' и спрашивать, почему 'p' не равна на '& p'. Почему адрес указателя будет равен адресу, сохраненному в нем? – Borgleader

+0

Если у вас есть C++ 11, предпочитайте 'std :: unique_ptr'' boost :: scoped_ptr'. –

+0

@Borgleader: Спасибо, я отредактировал сообщение. –

ответ

6

Почему &p и p.get() произвести различные результаты?

&p - адрес объекта scoped_ptr. p.get() - адрес объекта int, на который он указывает.

Почему *p.get()==*p и еще std::cout << p << '\n'; не компилируются?

Эти два не имеют отношения.

*p определено как то же, что и *p.get(): разыменование указателя с областью доступа к объекту, на который он указывает, а также разыменовывает необработанный указатель на один и тот же объект.

cout << p не скомпилирован, потому что нет перегрузки << для потоковых указателей.

Я работаю над g++ -std=c++11 -O2 -Wall -pedantic

Тогда рассмотрим std::unique_ptr (введен в C++ 11), а не boost::scoped_ptr. Это более стандартный, а также подвижный.

1

scoped_ptr или любые другие «умные указатели» - это что-то «указатель как объекты» вместо реальных указателей.

Эти смарт-указатели на самом деле объекты, конечно &p, которая получает указатель на это «смарт-объект указатель», отличается от p.get(), что метод возвращает указатель, который держит «смарт-объект указатель».

*p.get() эквивалентно *(p.get()), где p.get() возвращает указатель, который содержит p и *p эквивалентно «p.operator *()», который является перегруженным оператором, также возвращает указатель, который содержит p, поэтому *p.get()==*p ,

cout << p не компилируется, поскольку нет перегруженного оператора, который выводит p в поток.

1

scoped_ptr < T> - класс шаблона, имитирующий указатель. Активация этого класса создаст объект, который имеет аналогичные поведения в качестве указателей.

  • p.get возвращает адрес соответствующего значения типа T*: поэтому он возвращает адрес, возвращенный new int{1}, то есть значение в элементе, который указывает на соответствующий указатель.

  • &p возвращает адрес объекта р (то есть, где р проживает). р является контейнером, который имеет истинный элемент указателя, который указывает на адрес соответствующего значения типа T.

  • p не может ничего хорошего вернуться, потому что scoped_ptr<T> не имеет литую оператора, чтобы преобразовать себя в T* по выбору дизайна. Вы должны использовать для получения. Но он должен дать bool-подобный ответ в условном выражении, эквивалентном p.get() != 0.

  • cout << p терпит неудачу, потому что нет потока операторы, определенные для scoped_ptr < T>.

  • *p существует потому, что существует определенный унарный оператор *, который дает тот же результат, как *(p.get())

Смежные вопросы