Closed as duplicate of#95732
Description
The following code is accepted by clang but rejected by GCC,MSVC and ICC with the option of -std=c++11
:
template<typename,typename=int> struct Base { };
struct Derived : Base<void> { };
template<template<typename> class TT>
void func (TT<void>) { }
int main () {
func (Derived { });
}
https://timsong-cpp.github.io/cppwp/std11/temp.deduct.call#4 says that "If P is a class and P has the form simple-template-id, then the transformed A can be a derived class of the deduced A." So the class Derived
passed in line 9 can be deduced to its base type.
But the parameter requested by func
is a template class with 1 argument, while class Base
has 2(including 1 with default value), which seems incompatible.
It's interesting that gcc accepts that code under -std=c++20
, but other compilers don't. It seems that more standard docs need to be consulted.