1) Это работает, потому что в момент создания объекта (в вызове build) конструктор находится в области видимости. Помните, что в C ++ доступ управляется на основе типов, а не на основе объектов.
Внутри функции-члена (stati c или нет) у вас есть доступ ко всем publi c и защищенным членам of 'this' (для не-stati c функций), а также любой другой объект типа, который находится в области видимости. У вас также есть такой доступ к любым друзьям, находящимся в области видимости.
2) Можно выполнить ленивую инициализацию отдельного объекта типа и поместить его в стек, используя функцию stati c object Это общий шаблон для одноэлементных типов:
class example
{
example & get_object() {
static example object;
return object;
}
private: example () = default; };
Объект на самом деле не будет инициализирован, пока get_object () не будет вызван в первый раз.