Либерти, Эккель (философия С++), ну а дальше сам найдёшь)
Прата, Майерс, Дьюхерст, Александреску, Саттер...
Ну и много практики соответственно.
Всё чаще понимаю, что для качественного изучения языка нужно очень много с ним работать.
Желательно устроиться в хороший проект и работать.
Потому что в практическом использовании языка очень много уровней.
И бывает даже так, что не сталкиваешься в процессе с ситуациями, в которых можно отстрелить себе конечности.
А бывает и наоборот, для эффективного решения задачи приходится писать слабочитаемую шаблонную лапшу или обращаться к неперносимым фишкам компилятора\платформы..
Потому и важно иметь много практики.. Что бы понимать в каком случае какой уровень применим..
(Сам всегда стремлюсь делать как можно проще в рамках поставленной задачи. Не стремясь к бесконечной универсальности, а планируя только разумные возможности расширения системы. Ну и плюс рефакторинг само собой
)