【发布时间】:2021-04-07 13:06:46
【问题描述】:
C++ Clang 发出关于未使用模板变量的警告
考虑一个未使用的模板变量定义,比如这个:
template <typename T, typename = void>
struct is_complete : std::false_type {};
template <typename T>
struct is_complete<T, std::void_t<decltype(sizeof(T))>>
: std::true_type {};
template <typename T>
constexpr static inline auto is_complete_v = is_complete<T>::value;
在这里,Clang 发出关于未使用的 is_complete_v 变量的警告,这对我来说似乎是错误的。
如果未使用,为什么要实例化这样的变量符号?也许我错过了一点。
warning: unused variable 'is_complete_v' [-Wunused-const-variable]
static inline constexpr auto is_complete_v = is_complete_v<T>::value;
情况是,GCC 等其他编译器不会发出任何警告。
哪个 IMOO 有意义,因为该符号未解析。
我可以修复我正在使用的所有代码库:
template <typename T>
#if __clang__
[[maybe_unused]]
#endif
constexpr static inline auto is_complete_v = is_complete<T>::value;
或者通过禁用-Wunused-const-variable,
但我想知道:
- 有没有更简洁的方法来实现这一点?
- 这是正常行为吗?
【问题讨论】:
-
你能评论一下为什么
is_complete_v是static吗? Clang 可能会抱怨,因为它认识到该符号的任何实例都不可能在当前翻译单元之外使用,即使没有实例。 -
@Brian 感谢您指出这一点!这绝对是 C++ 标准迁移脚本的剩余部分,此后没有触发任何错误。事实上,
-Wall在使用 Clang 时被禁用(并且 Clang-CL /W4 没有触发它)。 -
变量确实没有使用
-
@BЈовић 我不同意。对我来说,这个模板变量符号没有实例化,因此从符号生成的角度来看根本不存在。因此,它不应生成警告。相反,如果您告诉我
is_complete_v<int>未使用,我会同意,因为这是一个定义明确的符号。 -
@Guss remove
static并且警告将消失。它没有很好的定义