【问题标题】:Issue warning on template instantiation based on template arguments基于模板参数的模板实例化发出警告
【发布时间】: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


    【解决方案1】:

    使用别名上的属性:

    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 主干。 Demo.

    【讨论】:

    • compiler-explorer 的链接不包含您在此处发布的代码(属性在外部结构上,而不是在 _t 别名上)。
    猜你喜欢
    • 2010-09-18
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多