Мы хотим выдать предупреждение компилятора, если пользователь наших заголовков создает шаблон с определенными шаблонными типами, что мы делали до сих пор с помощью специализации шаблона:
#include <deque>
#include <vector>
template <typename T, template <typename...> class CONTAINER>
struct select_container {
using _t =
CONTAINER<T>; // we don't have custom allocators for most containers
};
template <typename T>
struct select_container<T, std::vector> {
using _t = std::vector<T>; // meant for custom allocator
};
template <typename T>
struct select_container<T, std::deque> {
using _t = std::deque<T>; // custom allocator should also go here
[[deprecated("We won't stop you from using deque, but please think twice "
"(link to wiki).")]]
constexpr static inline int __bad() {
return 0;
}
enum { _bad = __bad() };
};
int foo() {
select_container<int, std::vector>::_t vector_version;
// select_container<int, std::deque>::_t deque_version;
return vector_version[0];
}
Это делает работу с g ++7 (предупреждение выдается, когда в коде deque_version
, и не выдает предупреждение, пока оно закомментировано).Однако при g ++ - 8 и clang ++ 5-8 предупреждение появляется всегда, даже когда не создается экземпляр select_container
(т.е. при удалении foo
из источника). См. В компиляторе-проводнике .