This is due to the fact that overload resolution is applied, and since the constructor argument b1 is equal to b , and b is not a constant lvalue, then a constructor that accepts not const const lvlalue is selected. And this is the first. Interestingly, both are copy constructors, but your code will be equal to valid only with the latter.
source share