如何抑制使用的内联函数但从未在 g++ 中定义警告

How to suppress inline function used but never defined warning in g++

上下文: 我正在做一些编译时编程,其中涉及使用仅在 decltype 上下文中评估的 constexpr 函数来操作类型。

例如,从类型列表中删除第一个类型的弹出函数:

template <typename T0, typename... T1toN>
constexpr auto pop(List<T0, T1toN...>) -> List<T1toN...>;

这些函数是这样使用的

decltype(pop(my_type_list))

换句话说,他们永远不会'executed'。然而,编译器 (g++) 给我警告,例如 warning: inline function ‘constexpr List<T1toN ...> pop(List<T0, T1toN ...>) [with T0 = Type1; T1toN = {Type2, Type3}]’ used but never defined

编辑:事实证明,仅当在 decltype 中间接评估函数时才会出现警告。即,仅在 decltype 中评估的顶级函数使用子函数。导致对子函数的警告。 Jarod42 创造了一个很好的再现场景 here

问题:有什么方法可以抑制这个已使用但从未定义的警告?是否可以仅对在 decltype 上下文中(间接)评估的函数执行此操作?

我正在使用 g++ 8.3 版

如果您在 C++17(或更高版本!)模式下编译,那么您应该能够将函数标记为 [[maybe_unused]]:

template <typename T0, typename... T1toN>
[[maybe_unused]] constexpr auto pop(List<T0, T1toN...>) -> List<T1toN...>;

如果您不使用 C++17 或者您不介意使用 gcc/g++ 特定属性,您可以尝试 __attribute__((unused)):

template <typename T0, typename... T1toN>
__attribute__((unused)) constexpr auto pop(List<T0, T1toN...>) -> List<T1toN...>;

template <typename ...> struct List{};

template <typename T0, typename... T1toN>
constexpr auto pop(List<T0, T1toN...>) -> List<T1toN...>;

template <typename T0, typename... T1toN>
constexpr auto pop2(List<T0, T1toN...> l) { return pop(l); } // You use pop

constexpr List<int, int> my_type_list;
using type = decltype(pop2(my_type_list));

Warning demo

pop2 应该没有定义,是:

template <typename T0, typename... T1toN>
constexpr auto pop2(List<T0, T1toN...> l) -> decltype(pop(l));