Как обеспечить, чтобы аргументы указывали на объекты только в статическом хранилище?

Я хотел бы убедиться, что аргумент, данный функции, указывает (или ссылается) на объект, который имеет статический класс продолжительности хранения.

Решение должно работать с 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). Это исключает, например, функцию локальных статических объектов.
  • Для каждого указателя создается шаблон функции. Я скептически отношусь к тому, сколько дублирования кода можно избежать с помощью оптимизации компилятора в реальном (продуктивном) развертывании. Ограничения относительно уровня оптимизации, разрешенного для использования в моем случае, должны быть определены.

Как можно обеспечить, чтобы аргументы, данные функциям, указывали (или ссылались) на объекты только в статической памяти? Желательно без оговорок в предложении я изложил. Принципиально разные решения приветствуются!

0 ответов

Другие вопросы по тегам