+template<typename FreedType>
+struct can_free
+{
+ /*
+ * gcc versions before 5.0 lack some type traits defined in C++11.
+ * Since in this instance we use the trait to prevent misuses
+ * of free (and statically assert) and not to generate different
+ * code based on this property, simply set value to true and allow
+ * the code to compile. Anyone using a contemporary compiler will
+ * catch the error.
+ */
+#if __GNUG__ && __GNUC__ < 5
+ static constexpr bool value = true;
+#else
+ static constexpr bool value = std::is_trivially_destructible<FreedType>::value ||
+ std::is_void<FreedType>::value;
+#endif
+};
+
+template <typename FreedType, typename = typename std::enable_if<!can_free<FreedType>::value>::type>
+void free(FreedType *p) = delete;
+
+template <typename InitializedType>
+struct can_memset {
+ static constexpr bool value = std::is_pod<InitializedType>::value ||
+ std::is_void<InitializedType>::value;
+};
+
+template <typename InitializedType,
+ typename = typename std::enable_if<!can_memset<InitializedType>::value>::type>
+void *memset(InitializedType *s, int c, size_t n) = delete;
+