clang:折叠表达式和 "expression result unused" 警告
clang: Fold expression and "expression result unused" warning
在 clang 7.0 上此代码:
template <typename ... Ts> struct S {
unsigned gs(unsigned i) {
unsigned r = 0;
((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
return r;
}
};
int foo(unsigned i) {
S<int, double, long, float, char> s;
return s.gs(3);
}
导致此警告:
~/dev/ta $ ~/bin/clang++ -c -std=c++17 fold-warning.cpp
fold-warning.cpp:5:46: warning: expression result unused [-Wunused-value]
((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
为什么?编译器逻辑未使用哪个表达式?
Gcc 7.3/8.2 很满意。
这一行的结果:
((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
是顺序||
操作,其结果未被使用,导致警告。
强制转换为 void
以消除警告:
(void)((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
在 clang 7.0 上此代码:
template <typename ... Ts> struct S {
unsigned gs(unsigned i) {
unsigned r = 0;
((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
return r;
}
};
int foo(unsigned i) {
S<int, double, long, float, char> s;
return s.gs(3);
}
导致此警告:
~/dev/ta $ ~/bin/clang++ -c -std=c++17 fold-warning.cpp
fold-warning.cpp:5:46: warning: expression result unused [-Wunused-value]
((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
为什么?编译器逻辑未使用哪个表达式?
Gcc 7.3/8.2 很满意。
这一行的结果:
((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
是顺序||
操作,其结果未被使用,导致警告。
强制转换为 void
以消除警告:
(void)((r = unsigned(sizeof(Ts)), i-- == 0) || ...);