I am learning about templates in C++, and came across an example where casting to void
is used:
template<typename T>
auto func (T const& t) -> decltype( (void)(t.size()), T::size_type() )
{
return t.size();
}
In the explanation it is written that:
The cast of the expression to void is to avoid the possibility of a user-defined comma operator overloaded for the type of the expressions.
My question(s) is/are:
How can a cast to void be used to "avoid the possibility of a user-defined comma operator overloaded for the type of the expressions"? I mean, can anyone give any example where if we don't use
void
then this code would give an error? For example, let's say we have a class calledSomeClass
which has overloaded the comma operator. Now, can this become a problem if we don't usevoid
?Can
static_cast
be used in this case instead of a C style cast? For example, something likestatic_cast<void>(t.size())
. I am reading examples that use C++17 features, and so I wonder why the author has used a C style cast in this case.
I have read What does casting to `void` really do?, from which I get the impression that if we use (void)x
then this means to suppress compiler warnings, and also means "ignore the value of x". But then I can't understand the difference between the expression x
and (void)x
.
T::size()
from returning an object which might have overloaded the comma operator. In which caset.size(), T::size_type()
would be the same ast.size().operator,(T::size_type())
– Petiolule,
is regular or doing bitwise inexclusive or ;) – Ewaewald