在基于模板参数的模板实例化时发出警告
Issue warning on template instantiation based on template arguments
我们希望发出编译器警告,如果我们的标头的用户使用某些模板化类型实例化模板,到目前为止我们通过模板专用化做到了这一点:
#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
),也会始终发出警告。请参阅编译器资源管理器。
使用别名上的属性:
template <typename T>
struct select_container<T, std::deque> {
using _t [[deprecated("We won't stop you from using deque, but please think twice "
"(link to wiki).")]] = std::deque<T>; // custom allocator should also go here
};
这适用于 gcc 和 clang 主干。演示。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- 模板实例化警告使用std :: unordered_map
- 警告 C4661:没有为显式模板实例化请求提供合适的定义
- 在基于模板参数的模板实例化时发出警告
- 是否有任何方法可以避免警告/错误模板实例化回溯