Проверьте документацию для инициализации ссылок [dcl.init.ref / 5] :
Ссылка на тип « cv1 T1
»Инициализируется выражением типа« cv2 T2
»следующим образом ..
В вашем случае
const std::string& sym(str, 5);
выражение является выражение буйного str, 5
. По сути, это то же самое, что если бы вы написали
const std::string& sym = (str, 5);
, что в обоих случаях сводится к ...
const std::string& sym = 5;
или
const std::string& sym(5);
Насколько я понимаю, стандарт позволяет инициализировать ссылку только одним выражением, а не парой выражений, разделенных запятой.
И нет соответствующего конструктора (который говорит о второй ошибке в вашей демонстрации Godbolt).
В качестве решения вы можете написать:
const std::string& sym{str, 5};
с тех пор, согласно [dcl.init / 17.1] :
Если инициализатором является (не заключенный в скобки) braced-init-list или =
braced-init-list , объект или ссылка инициализируется списком .