mizvekov wrote:

These void_t examples comparing with GCC goes besides the point of the original 
issue.

This is closely related to how GCC 'solves' CWG1980.

Their solution is to make an alias template with unused template parameters as 
non-transparent, as you say, making it a unique dependent type.

So for GCC, this is not much different than if you changed `void_t<U>` to just 
`U`, for the sake of this example in particular.

This is not a good solution, because it ties the questions of which type 
spellings are equivalent, into which are dependent, which should be orthogonal. 
And it doesn't provide a conforming solution for fully implementing CWG2064.
By requiring types to be dependent when they don't need to be, just to satisfy 
equivalency, we hamper template semantic analysis and require 'typename' and 
'template' keywords in a bunch of places that shouldn't be necessary.

Which is why https://github.com/llvm/llvm-project/pull/190495 takes a different 
approach which keeps these concerns orthogonal.

Template argument deduction doesn't care about equivalency, so the alias should 
be transparent for the purposes of partial ordering, making this ambiguous.

https://github.com/llvm/llvm-project/pull/214130
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to