https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80772
Bug ID: 80772
Summary: GCC ignores default template argument declaration in
the template definition
Product: gcc
Version: 7.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: devgs at ukr dot net
Target Milestone: ---
Compiled with: std=c++11
Affected versions: 4.8 - 7.1
#include <type_traits>
struct Foo
{ };
// This is a template function declaration, where second template argument
declared without a default
template <typename T, typename>
void foo(const Foo & foo, T t);
// This is a template function definition; second template argument now has a
default declared
template <typename T, typename = typename std::enable_if<1>::type>
void foo(const Foo & foo, T t)
{
}
int main(int argc, char ** argv)
{
foo(Foo{}, 1);
return 0;
}
GCC should merge default arguments, but it plainly ignores default argument in
the definition.
Standard [C++11 14.1 p10] says:
The set of default template-arguments available for use with a template
declaration or definition is obtained by merging the default arguments from the
definition (if in scope) and all declarations in scope in the same way default
function arguments are (8.3.6).
I could not find any other compiler that struggles with this piece of code,
except for GCC. And I tested a lot of them.