如何禁止分配不参考变量

how to forbid assignment to not reference variables?

本文关键字:分配 参考 变量 禁止 何禁止      更新时间:2023-10-16

我担心这是一个愚蠢的问题,但是...

某人可以建议我一种迫使我从函数(或方法)返回引用到内部静态变量或类/结构的成员的返回值的方法,仅分配给参考变量?

我试图用最小的例子来解释我想要的东西。

给定以下代码,并带有一个函数wrapValue(),该函数返回对内部静态变量的引用,

int & wrapValue (int v0)
 {
   static int val;
   return val = v0;
 }
int main ()
 {
   // how to permit this ...
   int & v0 { wrapValue(0) };
   // ... but forbid this ...
   int   v1 { wrapValue(1) };
   int   v2;
   // ... and this ?
   v2 = wrapValue(2);
 }

有一种方法可以允许v0初始化(并将v0绑定到静态变量),并禁止v1的初始化和v2的赋值(不限制v1v2到静态变量)?

)?

,如果我担心当前的C 标准是不可能的,那么有人会建议我另一种方法(但不太复杂:我打算在我想保持简单的库中使用它)禁止无限制的作业?

此解决方案有些棘手,但我认为(我认为)正如您所期望的:

#include <iostream>
struct int_wrapper {
    int value;
    int_wrapper &operator=(int value) {
        this->value = value;
        return *this;
    }
    operator int&() {
        return value;
    }
    operator int() {
        return value;
    }
};
int_wrapper& wrapValue (int v0) {
   static int_wrapper val;
   return val = v0;
}
int main () {
   // how to permit this ...
   int & v0 = wrapValue(0);
   // ... but forbid this ...
   //int   v1 { wrapValue(1) }; // call ambigious
   int   v2;
   (void)v0;
   (void)v2;
   // ... and this ?
   //v2 = wrapValue(2); // call ambigious
}

[live demo]

据我所知,

int是可复制的,因此人们可以根据自己的喜好复制;你不能阻止这一点。但是,您可以创建一个不可复制的包装类别。

class NonCopyableInt
{
    int val;
public:
    NonCopyableInt(int val) : val(val) {}
    NonCopyableInt(NonCopyableInt&) = delete;
    int& value() { return val; }
    // todo: add some nice operators and functions such as assignment from int
}
NonCopyableInt& wrapValue (int v0)
{
    static NonCopyableInt val;
    return val = v0;
}

但是,人们总是可以从value()复制返回值,以便您最终遇到相同的问题。而且感觉真的很笨拙,嗯。