我想确保给函数的参数指向(或引用)具有静态存储持续时间类的对象。
该解决方案需要在没有编译器特定扩展的情况下使用 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 之前)。这不包括例如函数本地静态对象。
- 对于每个指针,都会实例化一个函数模板。我怀疑在实际(生产)部署中通过编译器优化可以避免多少代码重复。将定义关于允许在我的情况下使用的优化级别的约束。
如何才能确保赋予函数的参数仅在静态存储期间指向(或引用)对象?最好没有我概述的提案的警告。欢迎根本不同的解决方案!