Default template parameter & lambda in unevaluated context: bug or feature?
Could someone provide an explanation of the rules that make ok3 true but ok4 false?
ok3 is true because uses lambdas type as default type.
The type of a lambda-expression (which is also the type of the closure object) is a unique, unnamed non-union class type,
Hence, default template type for object
, template parameter type for macro
and singltone
always different after every instatiation. But, for function function
call returned lambda is unique and its type is unique. Template function ctad
has template only for parameters but return value is unique. If rewrite function as:
template <class... Args, class T = decltype([]{})>
ctad(const Args&...) -> ctad<T>;
In this case return type will be defferent after every instantiation.