Что происходит, так это то, что ссылка 'str' инициализируется так, что она указывает на временный аргумент 's'. Это почти то же самое, что и использование указателя - вы рассчитываете на постоянное существование вашего конструктора arg, 's'. Когда временный объект удаляется (после возврата из конструктора ftn), ваша ссылка теперь указывает на мусор.
Чтобы исправить, измените str так, чтобы он был действительным строковым объектом, а не ссылкой.
const std :: string str;
Таким образом, будет сделана копия вашей строки arg, и указанная копия будет иметь тот же срок жизни, что и ваш объект Foo.