Я реализую класс, который использует идиому RAII. Этот класс, очевидно, должен создаваться только в стеке, поэтому я ищу способ применить это.
Это не RAII. RAII инициализируется при построении и деинициализации в деструкторах. RAII касается ресурсов, которыми вы управляете (например, члены данных), а не времени жизни «родительского» объекта. Пользователи вашего типа затем снова применяют RAII для управления временем жизни того, что они выделяют. Например, вы можете динамически распределить std :: vector, даже если vector использует RAII, чтобы убедиться, что каждый элемент , который он «владеет», очищен.
Мой вопрос: есть ли у него какие-либо побочные эффекты, которые не так просто увидеть?
Да, вы предотвращаете использование вашего типа (по крайней мере, в отношении RAII).
void example() {
shared_ptr<T> p (new T());
// No RAII violation, still uses operator new.
vector<T> v (some_initial_size);
// No RAII violation, still uses operator new (the placement form is used
// inside the default allocator).
}
Это хороший подход для принудительного создания экземпляров в стеке?
Что вы пытаетесь предотвратить? Какой вариант использования? Любой, кто использует new с вашим типом, либо 1) знает, что он делает, и нуждается в нем, либо 2) ужасно испортит управление ресурсами, независимо от того, что вы делаете. Вы препятствуете тем, кто находится в # 1, не помогая тем, кто находится в # 2, пытаясь применить это.
Это еще один способ заявить, что сказал Стив:
Этот класс, очевидно, должен создаваться только в стеке, поэтому я ищу способ применить это.
Если это очевидно, зачем его применять?
Если пользователи будут слепо использовать «new T ()», что заставляет вас думать, что они не будут слепо использовать «:: new T ()»?
Цель состоит в том, чтобы просто предоставить простую возможность настроить платформу и перевести ее в состояние готовности к использованию без необходимости создания 10 объектов в клиентском коде.
#include <framework>
int main() {
framework::Init init;
// Do stuff.
}
Используйте это или что-то очень близкое к этому, что заметно в примерах ваших документов.