2017-02-09 25 views
6

Невозможно понять, почему это не удается?Печать unique_ptr to cout

int *p = new int(10); 
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 
// Below line works well. 
std::cout << "Value pointed ptr " << *ptr << std::endl; 
std::cout << "Value of ptr->get() " << ptr.get() << std::endl; 

Я понимаю это так:

Say адрес р равен 100, адрес новой выделенной памяти 200.

p    new allocated memory 
----------  --------- 
    200    10 
----------  --------- 
100    200 


ptr 
---------- 
    200 
---------- 
300 

В изображении выше, unique_ptr это указывает на вновь выделенной памяти сам, избегая «р». Итак, не следует ли печатать «ptr», мне 200?

ответ

2

Итак, не следует ли печатать 'ptr' дать мне 200?

Он должен, если стандартная библиотека, указанная std::unique_ptr, должна быть потоковой в стандартных потоках. Другими словами, должна существовать перегрузка operator << для std::unique_ptr.

Однако стандарт не указывает на такую ​​вещь, и поэтому потоковая передача unique_ptr приводит к ошибке компиляции (нет operator << принимает это). Решение состоит в том, как вы обнаружили: если вам нужно, чтобы поток указателя получить указатель:

stream << ptr.get() 
+0

Oho. Имеют смысл. Купите, что остановило сообщество C++ для перегрузки <

+1

@HemantBhargava: Не нужно. Стандарт C++ уже слишком велик (*), добавляя материал, который почти никто не будет использовать, сделает его больше. *: Нет, у меня нет хорошего предложения о том, что удалить. –

+2

@MartinBonner Что касается прореживания предложений, 'std :: vector ' приходит на ум. – Angew

9
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 

Чтобы сделать это можно использовать обычный << синтаксис для печати объекта некоторых класса с использованием cout, должна быть обеспечена надлежащая перегрузка operator<<.

Например, если у вас есть класс X, если вы хотите, чтобы включить синтаксис cout << x, вы можете перегрузить operator<< так:

#include <ostream> // for std::ostream 

std::ostream& operator<<(std::ostream& os, const X& x) 
{ 
    // Implement your output logic for 'x' 
    ... 

    return os; 
} 

C++ стандартные разработчики библиотеки решили не реализовывать такую ​​перегрузку для std::unique_ptr; вот почему вы получаете ошибку компиляции при попытке использовать << с экземплярами unique_ptr s.