On Saturday, 28 April 2012 at 09:40:49 UTC, Timon Gehr wrote:
On 04/28/2012 09:46 AM, Max Samukha wrote:
On Saturday, 28 April 2012 at 06:03:54 UTC, Mehrdad wrote:
You expected that to work?
Uhm, why not?
template<class T>
struct F
{
F<F<T> > f() { return F<F<T> >(); }
};
int main()
{
F<int>().f().f().f().f().f(); // etc.
return 0;
}
dmd is not smart enough
DMD behaves according to the language specification here.
That is not specified anywhere in the language specification.
to avoid recursion by treating f as a
templated function. I am not sure whether it should,
Maybe, but that would be a strange special case.
That is arguable. Non-templated functions are a special
(degenerate) case of templated functions. The way virtual
functions work doesn't allow C++/D to fully implement that
notion. Mark f() 'virtual' in the C++ example and the code won't
compile. Otherwise, C++ tries to be close to the ideal and I
would expect D be no worse.
but the following should certainly work:
struct F(T)
{
auto f()() { return F!(F!T)(); }
}
void main()
{
F!int().f().f().f();
}
Error: struct a.F(T) recursive template expansion for template
argument - why?
The checking for infinite recursion seems to be too
conservative here. You could open a bug report.