clang:折叠表达式和“未使用表达式结果”警告

时间:2018-10-07 02:39:52

标签: c++ templates c++17 variadic-templates clang++

在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对此感到满意。

1 个答案:

答案 0 :(得分:6)

此行的结果:

((r = unsigned(sizeof(Ts)), i-- == 0) || ...);

是连续的||操作,未使用其结果,从而引起警告。

投射到void以消除该警告:

(void)((r = unsigned(sizeof(Ts)), i-- == 0) || ...);