Move QTypeInfo<std::pair> from qpair.h to qtypeinfo.h to avoid ODR violation
First off, this doesn't cost us anything, because std::pair is defined in <utility>, which qglobal.h unconditionally includes in C++ TUs. More importantly, it prevents ODR violations: when a TU includes only qtypeinfo.h, it will find std::pair<int, int> to be of Q_COMPLEX_TYPE, in constrast with a TU which includes qpair.h, which will find it to be of Q_PRIMITIVE_TYPE instead. [ChangeLog][QtCore][QTypeInfo] The QTypeInfo for std::pair/QPair will now be correct even if qpair.h hasn't been included, fixing an One-Definition-Rule (ODR) violation. Pick-to: 6.5 6.4 6.2 Change-Id: I51f579c123183af25aac9f0ffcf077f752848fb1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
d55d93629b
commit
f6b026eed1
@ -94,6 +94,12 @@ public:
|
||||
static constexpr bool isValueInitializationBitwiseZero = false;
|
||||
};
|
||||
|
||||
// QTypeInfo for std::pair:
|
||||
// std::pair is spec'ed to be struct { T1 first; T2 second; }, so, unlike tuple<>,
|
||||
// we _can_ specialize QTypeInfo for pair<>:
|
||||
template <class T1, class T2>
|
||||
class QTypeInfo<std::pair<T1, T2>> : public QTypeInfoMerger<std::pair<T1, T2>, T1, T2> {};
|
||||
|
||||
#define Q_DECLARE_MOVABLE_CONTAINER(CONTAINER) \
|
||||
template <typename ...T> \
|
||||
class QTypeInfo<CONTAINER<T...>> \
|
||||
|
@ -22,9 +22,6 @@ constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2)
|
||||
return std::make_pair(std::forward<T1>(value1), std::forward<T2>(value2));
|
||||
}
|
||||
|
||||
template<class T1, class T2>
|
||||
class QTypeInfo<std::pair<T1, T2>> : public QTypeInfoMerger<std::pair<T1, T2>, T1, T2> {};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QPAIR_H
|
||||
|
Loading…
Reference in New Issue
Block a user