A>Чтобы функции-члены класса std::string имели атрибут volatile.
Боюсь, что функции-члены не могут иметь атрибут volatile просто синтаксически.
Использование volatile ограничивает возможности компилятора по оптимизации, т.к. volatile-объекты могут быть изменены в произвольный момент времени другим потоком (или обработчиком аппаратного прерывания ) Применение volatile к объектам, не являющимися простыми типами (т.е. не int, например) вероятно может повлиять только на оптимизацию inline-методов, т.к. все члены такого объекта также volatile.
Уж не знаю, что имел в виду мудрый препод, но для работы с volatile std::string нужна критическая секция в том или ином виде, иначе при параллельном обращении к string ее внутреннее состояние с большой вероятностью будет разрушено