2

我想确保给函数的参数指向(或引用)具有静态存储持续时间类的对象。

该解决方案需要在没有编译器特定扩展的情况下使用 C++11。

我在研究过程中发现的最相似的问题是仅限于 C 语言的问题。到目前为止,那里提出的解决方案仅适用于编译器特定的扩展。

我想过使用非类型模板参数来限制指向静态存储持续时间的指针,如下所示:

/** @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 之前)。这不包括例如函数本地静态对象。
  • 对于每个指针,都会实例化一个函数模板。我怀疑在实际(生产)部署中通过编译器优化可以避免多少代码重复。将定义关于允许在我的情况下使用的优化级别的约束。

如何才能确保赋予函数的参数仅在静态存储期间指向(或引用)对象?最好没有我概述的提案的警告。欢迎根本不同的解决方案!

4

0 回答 0