https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100825
--- Comment #6 from vopl at bk dot ru ---
(In reply to Jonathan Wakely from comment #5)
> Yes, I realise that, but I think that is the same rule that means you can't
> change the result of overload resolution for a given call,
But I have a precedent:
void foo(char) {}
void useFirst()
{
foo(0); // "void foo(char)" used, no "void foo(int)" visible at now
}
void foo(int) {} // introduce second function
void useSecond()
{
foo(0); // "void foo(int)" selected as more suitable
}
> which is why the
> second definition gets emitted using the same symbol name as the first.
[defns.signature.templ] states that trailing require-clause is a part of
function signature, so these are two different functions:
template <class T> void foo() {}
template <class T> void foo() requires true {}
Since the signature is the basis for name mangling - different names are
expected for different functions..
> If the constrained overload is declared before the first call to foo<int>()
> then there is no error.
Aha, in such situation there is an only call, no second one, so, no second
symbol and no conflicts.
Thanks.