LINUX.ORG.RU

История изменений

Исправление kvpfs_2, (текущая версия) :

Ну если тебя эта проблема действительно сильно тревожит, и ты хочешь обезопасить себя и сделать максимально очевидно, то нет никаких проблем:

template <typename T>
class Stored_ptr {
   template <typename U>
      friend Stored_ptr<U> make_stored_ptr(U *p);
   Stored_ptr(T *ptr) : p{ptr} {};
public:
   T *p;
};

template <typename U>
Stored_ptr<U> make_stored_ptr(U *p) {
   return {p};
}

struct S {
   int *p;
   S(Stored_ptr<int> ptr) : p{ptr.p} {}
};

int main() {
   int *i = nullptr;
   S s(make_stored_ptr(i));
}

Ты никак не передашь случайно указатель на сохранение, тебя явно нужно написать make_stored_ptr, что очевидно при чтении. Не знаю, я так не заморачиваюсь, сохранить голый указатель в классе - это редкое исключение, заюзаю в случае чего ту свою небольшую обертку

Исходная версия kvpfs_2, :

Ну если тебя эта проблема действительно сильно тревожит, и ты хочешь обезопасить себя и сделать максимально очевидно, то нет никаких проблем:

template <typename T>
class Stored_ptr {
public:
   template <typename U>
      friend Stored_ptr<U> make_stored_ptr(U *p);
   Stored_ptr(T *ptr) : p{ptr} {};
   T *p;
};

template <typename U>
Stored_ptr<U> make_stored_ptr(U *p) {
   return {p};
}

struct S {
   int *p;
   S(Stored_ptr<int> ptr) : p{ptr.p} {}
};

int main() {
   int *i = nullptr;
   S s(make_stored_ptr(i));
}

Ты никак не передашь случайно указатель на сохранение, тебя явно нужно написать make_stored_ptr, что очевидно при чтении. Не знаю, я так не заморачиваюсь, сохранить голый указатель в классе - это редкое исключение, заюзаю в случае чего ту свою небольшую обертку