如何抑制使用的内联函数但从未在 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));
pop2
应该没有定义,是:
template <typename T0, typename... T1toN>
constexpr auto pop2(List<T0, T1toN...> l) -> decltype(pop(l));
上下文: 我正在做一些编译时编程,其中涉及使用仅在 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));
pop2
应该没有定义,是:
template <typename T0, typename... T1toN>
constexpr auto pop2(List<T0, T1toN...> l) -> decltype(pop(l));