IMHO the official reason for that constraint is that the compiler can't handle it actually by himself.
It is just a flag for the compiler which can also be set by himself, because the compiler does recognizes the fact, that we need a constructor constraint. So it could be handled automatically by the compiler, because the Generic class will be compiled before using that class.
Maybe we will get it with XE9
UPDATE
If TComponent is accepted as a class type without a public parameterless constructor then the constructor constraint is useless, because this (extended sample from Nick) compiles and produces a TComponent Instance. Of course it will not call the original constructor TComponent.Create( AOwner : TComponent ), instead TObject.Create is called, but you have a TComponent Instance.
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, System.Classes;
type
TSomeClass<T: class, constructor> = class
function GetType: T;
end;
{ TSomeClass<T> }
function TSomeClass<T>.GetType: T;
begin
Result := T.Create;
end;
var
SomeClass : TSomeClass<TComponent>;
Component : TComponent;
begin
try
SomeClass := TSomeClass<TComponent>.Create;
Component := SomeClass.GetType;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
UPDATE
TSomeClass<T: class, constructor>
has the same meaning as
TSomeClass<T: constructor>
because a record can have a constructor, but not a parameterless, so we have an implicit constraint to a class. And turning this around
TSomeClass<T: class>
could have an implicit constructor constraint