История изменений
Исправление 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, что очевидно при чтении. Не знаю, я так не заморачиваюсь, сохранить голый указатель в классе - это редкое исключение, заюзаю в случае чего ту свою небольшую обертку