# Splittable

[req.splittable]

A type is splittable if it has a splitting constructor that allows an instance to be split into two pieces. The splitting constructor takes as arguments a reference to the original object, and a dummy argument of type `split`, which is defined by the library. The dummy argument distinguishes the splitting constructor from a copy constructor. After the constructor runs, `x` and the newly constructed object should represent the two pieces of the original `x.` The library uses splitting constructors in two contexts:

- Partitioning a range into two subranges that can be processed concurrently.

- Forking a body (function object) into two bodies that can run concurrently.

Types that meet the Range requirements may additionally define an optional proportional splitting constructor, distinguished by an argument of type proportional_split Class.

A type X satisfies Splittable if it meets the following requirements:

Splittable Requirements: Pseudo-Signature, Semantics

X::X(X &x, split)

  Split `x` into `x` and newly constructed object.

See also:

- Range requirements