C++ 叮当声:折叠表达和;“未使用的表达式结果”;警告
在clang 7.0上,此代码: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;
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)]