Предположим, у меня есть следующий шаблон класса:
template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};
Я просмотрел стандарт C99 и стандарт C++03 и не могу найти гарантии для моего предположения, выраженного в static_assert
. Я попробовал его на Visual C++ 2008 и 2010 (32-бит )и gcc на linux (64-бит ), используя несколько параметров компилятора, и мое предположение подтвердилось.
Мой вопрос::
Я предполагаю, что компилятор мог бы добавить некоторые дополнения к структуре, например. в целях отладки. Но есть ли компилятор, который действительно это делает?
Изменить:Итак, как вы спросили, вот чего я хочу достичь:
У меня есть функция-член со следующей сигнатурой:
Someclass* OtherClass::fn();
Я хочу изменить сигнатуру вот так:
Wrapper<Someclass> OtherClass::fn();
Эта оболочка действует как какая-то умная -указатель, т.е. он заботится о времени жизни указателя, поэтому он освобождает его, когда он выходит за пределы области видимости. Поскольку функция вызывается через границу dll, я хочу убедиться, что возвращаемое значение (, которое теперь является конкретным типом, а не просто тупым указателем ), при любых обстоятельствах (, т.е. настройки компилятора и т. д. )того же размера, что и указатель. План/надежда состоит в том, чтобы поддерживать все комбинации отладки/выпуска приложений/сборок dll.
Как вы можете спросить :нет, я не могу использовать boost ::shared _ptr<>, std ::shared _ptr<>, std ::unique _ptr<> и например, поскольку мы не хотим предоставлять boost пользователю dll, и мы еще не поддерживаем C++11.