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.
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.
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.