Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Non-copyable elements in vector

I have a non-copyable class (i.e. the copy constructor & assignment operator are marked as 'delete'). I would like to keep these in a std::vector.

It is a RAII class so simply storing the pointer or reference to it is not what I am looking for.

My knowledge of the new initialiser lists & move constructors is somewhat limited, is this possible?

like image 521
Lieuwe Avatar asked Nov 13 '14 09:11

Lieuwe


People also ask

What is a non copyable class?

A class called non-copyable is defined which has a private copy constructor and copy assignment operator.

Are vectors trivially copyable?

Formally, a std::vector<T> (for any T ) is not trivially copyable because its copy constructor is not trivial, if only because it's user-provided (as opposed to implicitly-defined).

What is boost :: Noncopyable?

Boost::noncopyable prevents the classes methods from accidentally using the private copy constructor.

Does Push_back copy or move?

The push_back method is used to append an element in a sequential STL container (e.g., std::vector). When inserted using the push_back, the new element is copy-or-move-constructed.


2 Answers

Yes you can have std::vector<NotCopyable> if NotCopyable is movable:

struct NotCopyable
{
    NotCopyable() = default;
    NotCopyable(const NotCopyable&) = delete;
    NotCopyable& operator = (const NotCopyable&) = delete;

    NotCopyable(NotCopyable&&) = default;
    NotCopyable& operator = (NotCopyable&&) = default;
};

int main()
{
    std::vector<NotCopyable> v;
    NotCopyable nc;

    v.push_back(NotCopyable{});
    v.emplace_back();
    v.push_back(std::move(nc));
}

Live example.

like image 116
Jarod42 Avatar answered Nov 03 '22 02:11

Jarod42


As long as the elements are movable then, yes, simply store them in the vector.

like image 24
Lightness Races in Orbit Avatar answered Nov 03 '22 02:11

Lightness Races in Orbit