Как обеспечить, чтобы аргументы указывали на объекты только в статическом хранилище?
Я хотел бы убедиться, что аргумент, данный функции, указывает (или ссылается) на объект, который имеет статический класс продолжительности хранения.
Решение должно работать с C++11 без специальных расширений компилятора.
Наиболее похожий вопрос, который я нашел во время моего исследования, это вопрос, который ограничен языком Си. Решения, предложенные там, до сих пор работают только с конкретными расширениями компилятора.
Я думал об использовании нетиповых параметров шаблона, чтобы ограничить указатели статической продолжительностью хранения, как это:
/** @tparam POINTER must point to an integer with static storage duration
* (and linkage [before C++17])
* @return value pointed to by template argument */
template<int * POINTER>
int letPassStaticStorageDurationOnly()
{
return *POINTER;
}
int staticStorageInt = 42; // variable with static storage duration
int* pointerToStaticStorageInt = &staticStorageInt; // pointer to variable
int main()
{
int autoStorageInt = -42;
static int functionStaticInt = -21;
// error: because 'autoStorageInt' has no linkage
return letPassStaticStorageDurationOnly<&autoStorageInt>(); // shall fail
// error: because is a variable, not the address of a variable
return letPassStaticStorageDurationOnly<pointerToStaticStorageInt>();
// error [<C++17]: because 'functionStaticInt' has no linkage
return letPassStaticStorageDurationOnly<&functionStaticInt>();
return letPassStaticStorageDurationOnly<&staticStorageInt>(); // works
}
К сожалению, это имеет (по крайней мере) следующие предостережения:
- Объекты должны иметь связь ( до C++ 17). Это исключает, например, функцию локальных статических объектов.
- Для каждого указателя создается шаблон функции. Я скептически отношусь к тому, сколько дублирования кода можно избежать с помощью оптимизации компилятора в реальном (продуктивном) развертывании. Ограничения относительно уровня оптимизации, разрешенного для использования в моем случае, должны быть определены.
Как можно обеспечить, чтобы аргументы, данные функциям, указывали (или ссылались) на объекты только в статической памяти? Желательно без оговорок в предложении я изложил. Принципиально разные решения приветствуются!