【发布时间】:2019-01-28 14:36:24
【问题描述】:
如果我们头文件的用户使用某些模板化类型实例化模板,我们希望发出编译器警告,到目前为止我们通过模板专业化做到了这一点:
#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),也会始终发出警告。 See on compiler-explorer.
【问题讨论】:
标签: c++ templates g++ clang++ gcc-warning