The firstprivate clause provides a superset of the functionality provided by the private clause. The syntax of the firstprivate clause is as follows:
Variables specified in variable-list have private clause semantics, as described in Section 22.214.171.124 on page 25. The initialization or construction happens as if it were done once per thread, prior to the thread's execution of the construct. For a firstprivate clause on a parallel construct, the initial value of the new private object is the value of the original object that exists immediately prior to the parallel construct for the thread that encounters it. For a firstprivate clause on a work-sharing construct, the initial value of the new private object for each thread that executes the work-sharing construct is the value of the original object that exists prior to the point in time that the same thread encounters the work-sharing construct. In addition, for C++ objects, the new private object for each thread is copy constructed from the original object.
The restrictions to the firstprivate clause are as follows:
A variable specified in a firstprivate clause must not have an incomplete type or a reference type.
A variable with a class type that is specified as firstprivate must have an accessible, unambiguous copy constructor.
Variables that are private within a parallel region or that appear in the reduction clause of a parallel directive cannot be specified in a firstprivate clause on a work-sharing directive that binds to the parallel construct.