Tag dispatch for enqueue/dequeue implementation
Summary:
clang (>=3.6?) reports potential object slicing bug when MPMCQueue is used for
polymorphic class as the queue item, e.g. as in P19814469. This can be false
positive however, since the choice is based on the type trait already. This
diff uses tag dispatch to selectively compile the overload that will be
executed, therefore if there is no-throw move ctor supplied clang will not
examine the simulated relocation code.
This doesn't avoid object slicing bug however if the client insists to use
MPMCQueue to hold base class while enqueue and dequeue with subclassed item.
Test Plan: compile with --clang
Reviewed By: tudorb@fb.com
Subscribers: folly-diffs@, yfeldblum, chalfant
FB internal diff:
D2029949
Signature: t1:
2029949:
1430264357:
af479117adf90bc1915c071e7376a30aacb72f46