是否存在一次性变量的概念?

Does there exist the concept of set-once variables?

我想知道是否有人提出了一次设置变量的概念。也就是说,一个变量可能有一些默认值,但在程序执行期间只能设置一次。请注意,这不同于任何类型的常量,因为常量是在程序执行之前设置的。

C 或 C++ 中不存在这样的结构。

好吧,C++ 参考资料就是这样做的。

参考变量,例如T & ref,只能绑定一次(但在 运行 时,可以绑定任何东西)。在那之后,指针表达式 &ref 实际上是一个常量,语言规则不允许它改变。

没有针对此的预打包解决方案,但由于我们现在有 once_flag,我们可以编写一个矫枉过正的解决方案来保证您只能调用 operator= 一次:

template <typename T>
class SetOnce
{
public:
    SetOnce(T const& v)
    : val(v)
    { }

    SetOnce& operator=(T const& v) {
        std::call_once(flag, [=]{
            val = v;
        });
        return *this;
    }

    T get() const { return val; }

private:
    std::once_flag flag;
    T val;
};

int main() {
    SetOnce<int> so(4);
    std::cout << so.get() << '\n'; // 4
    so = 5;
    std::cout << so.get() << '\n'; // 5
    so = 6;
    std::cout << so.get() << '\n'; // still 5
}

不确定你会用这样的东西做什么,但 C++11 确实很酷。

也许可以使用一对函数来影响一个一次性变量

#include <assert.h>
#include <stdlib.h>

#define set_once_default 7
typedef struct set_once_S set_once_T;

set_once_T *value = NULL;

int set_once_read(set_once_T *ptr) {
  if (ptr == NULL) return set_once_default;
  return *((int *) ptr);
}

void set_once_write(set_once_T *ptr, int value) {
  if (ptr == NULL) {
    ptr = malloc(sizeof value);
    assert(ptr);
    *((int *) ptr) = value;
  }
}

如果需要非全局 set_once_T,代码需要 free() 它超出范围。