Каково основное использование aligned_storage?

Каково основное использование std:: tr1:: aligned_storage? Может ли он использоваться как автоматическая память для типа данных Foo, как показано ниже?

   struct Foo{...};
   std::tr1::aligned_storage<sizeof(Foo)
        ,std::tr1::alignment_of<Foo>::value >::type buf;
   Foo* f = new (reinterpret_cast<void*>(&buf)) Foo();
   f->~Foo();

Если да, то как насчет хранения нескольких Foo в buf, например,

    std::tr1::aligned_storage<5*sizeof(Foo)
            ,std::tr1::alignment_of<Foo>::value >::type buf;
    Foo* p = reinterpret_cast<Foo*>(&buf);
    for(int i = 0; i!= 5; ++i,++p)
    {
        Foo* f = new (p) Foo();
    }

Являются ли они действующими программами? Есть ли другой вариант использования? Поиск в Google дает только документацию по aligned_storage, но очень мало о ее использовании.

Ответ 1

Хорошо, кроме вашего использования reinterpret_cast, это выглядит хорошо для меня. (Я не уверен на 100% на втором).

Проблема с reinterpret_cast заключается в том, что она не дает никаких гарантий относительно результата приведения, только если вы вернете результат обратно к исходному типу, вы получите исходное значение. Таким образом, нет никакой гарантии, что результат приведения будет содержать один и тот же шаблон бита или указать один и тот же адрес.

Насколько я знаю, портативное решение для литья указателя x в тип T * имеет значение static_cast<T*>(static_cast<void*>(x)), так как static_cast to и from void* гарантированно превратит указатель на тот же адрес.

Но это касается только касательно вашего вопроса.:)