При просмотре лекции Степанова наткнулся на такой код —
template <typename T, typename N = std::size_t>
class list_pool {
public:
typedef N list_type;
typedef T value_type;
//...не важно
private:
//...не важно
public:
struct iterator {
typedef list_pool::value_type value_type;
typedef list_pool::list_type difference_type;
typedef std::forward_iterator_tag iterator_category;
typedef value_type& reference;
typedef value_type* pointer;
list_pool* pool;
list_pool::list_type node;
iterator() {} //!!!!! creates a partially formed value
//не важно
};
};
Степанов говорит, что для объекта вполне нормально находиться в частично сконструированном состоянии, в котором ему может быть только присвоено значение или он может быть разрушен (ну типа как источник std::move собственно после std::move), но мне как-то это не очень нравится (инварианта-то после конструирования нет). А Вы бы определили конструктор по умолчанию в этом случае?