如何禁止赋值不引用变量?

时间:2016-12-10 13:40:12

标签: c++ c++11 reference initialization c++14

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

有人可以建议我强制一个函数(或方法)的返回值,它返回对内部静态变量或类/结构的成员的引用,只分配给引用变量?

我尝试用最小的例子来解释我的愿望。

给定以下代码,函数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 ++标准不可能,我担心,有人可以建议我另一种方式(但不是太复杂:我打算在我想保持简单的库中使用它)禁止一个无限的任务?

2 个答案:

答案 0 :(得分:4)

这个解决方案有些棘手,但它可以正常运行(我认为):

#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]

答案 1 :(得分:2)

据我所知,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()复制返回值,因此您最终会遇到同样的问题。它感觉真的很笨拙而且很好。