c++ - 如何禁止分配给不引用变量?

标签 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绑定(bind)到静态变量)并禁止初始化v1v2 的赋值(不将 v1v2 绑定(bind)到静态变量)?

如果当前的 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]

关于c++ - 如何禁止分配给不引用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41076212/

相关文章:

lambda - C++0x 闭包的未定义行为 : II

c++ - 我们能和复制构造函数说再见吗?

qt - undefined reference qt opencv

c++ - 比较同一文件中的数据行

C++类设计: class or functions in unnamed namespace or private class method?

c++ - 进程启动限制

C 指针和引用

c++ - 如何从模式到模式提取字符串?

C++(11) : When to use direct or copy initialization if both are perfectly fine

c++ - 像这样重新安装一对引用文献合法吗?