Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 叮当声:折叠表达和;“未使用的表达式结果”;警告_C++_Templates_C++17_Variadic Templates_Clang++ - Fatal编程技术网

C++ 叮当声:折叠表达和;“未使用的表达式结果”;警告

C++ 叮当声:折叠表达和;“未使用的表达式结果”;警告,c++,templates,c++17,variadic-templates,clang++,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;

在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);
}
为什么??根据编译器的逻辑,哪个表达式未使用


Gcc 7.3/8.2对此表示满意。

这一行的结果:

((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
是一个连续的
|
操作,其结果未被使用,导致警告

铸造到
void
以消除警告:

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

这一行的结果是:

((r = unsigned(sizeof(Ts)), i-- == 0) || ...);
是一个连续的
|
操作,其结果未被使用,导致警告

铸造到
void
以消除警告:

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

这里没有什么可以展开的,它正在展开(r=unsigned(sizeof(Ts)),i--=0)。当没有什么可展开时,编译器会给出不同的诊断。这是一个稍微修改过的真实代码版本,可以正常工作。唯一的问题是clang发出的警告。您在这里试图做什么?在实际代码中,来自类型Ts的列表,我想要列表上具有给定索引的类型T的f()结果。显示的代码返回T的sizeof。以前我对其类型使用了元组和递归,但上面的代码提供了一个更紧凑的解决方案。@l.f.
(std::size_T[]){sizeof(Ts)…}[(std::min)(I,sizeof…(Ts)-1)](std::size_T[]){sizeof(Ts)}[(std::min)(I,sizeof…(Ts)-1)]