IAlloc(alloc) is parsed as 'IAlloc alloc' and is a valid parameter
definition. Here is a simplified version of your line:
vector<int, IAlloc> viA(int(alloc));
which is also parsed as a function declaration:
vector<int, IAlloc> viA(int alloc);
To get it parsed as a variable definition add some parens:
vector<int, IAlloc> viA((IAlloc(alloc))); // does work
I agree these parsing rules are obnoxious and should be changed somehow.