Once you have a default value for a parameter... all parameters that follow it must also have default values.
Think about it... how would you call this ctor and use those default values: inline matrix(unsigned rows = 0, unsigned cols = 0, int fillValue)
1 2 3 4 5 6 7
matrix(5); // the '5' is the first param, so compiler thinks it's for your rows
// error because there's no value for 'fillValue'
matrix(5,3); // again... this just specifies rows/cols. No value for fillValue
// still an error
matrix(5,3,2); // this will work, but you're not using any of the default values, so they're useless