C++ 如何禁止对非引用变量赋值?

C++ 如何禁止对非引用变量赋值?,c++,c++11,reference,initialization,c++14,C++,C++11,Reference,Initialization,C++14,我担心这是个愚蠢的问题,但是 有人可以建议我一种方法,强制将函数(或方法)返回的返回值(返回对内部静态变量或类/结构成员的引用)仅分配给引用变量 我试着用一个简单的例子来解释我想要什么 给定以下代码,函数wrapValue()返回对内部静态变量的引用 int & wrapValue (int v0) { static int val; return val = v0; } int main () { // how to permit this ... i

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

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

我试着用一个简单的例子来解释我想要什么

给定以下代码,函数
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
(不将
v1
v2
绑定到静态变量)


如果用当前的C++标准是不可能的,我担心,有人可以给我一个替代的方法(但不是太复杂:我打算在一个我想保持简单的库中使用它)禁止一个无界的赋值。

< P>我知道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()复制返回值,因此最终会出现相同的问题。而且感觉非常笨重。这个解决方案有点棘手,但它(我认为)正如您所期望的:

#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
}
#包括
结构整型包装器{
int值;
int_包装器和运算符=(int值){
这个->值=值;
归还*这个;
}
运算符int&(){
返回值;
}
运算符int(){
返回值;
}
};
int_包装器和包装值(int v0){
静态整数;
返回值=v0;
}
int main(){
//如何允许这个。。。
int&v0=wrapValue(0);
//…但禁止这样做。。。
//int v1{wrapValue(1)};//调用不明确
int v2;
(无效)v0;
(无效)v2;
//…还有这个?
//v2=wrapValue(2);//调用含糊不清
}

您为什么要这样做?调用方对返回值的处理方式是否取决于调用方?也许您不希望复制该值,而只希望移动和构造该值?或者甚至没有移动?@AlanStokes-问题是,如果用户将我开发的方法(用于argc/argv值解析的选项的类)返回的值放在一个简单(非引用)值中,就会丢失接下来将被解析的值。也许这是一个愚蠢的想法,但如果用户记住
&
,它似乎工作得很好。我英语不好,所以对我来说很难解释。。。如果您感兴趣(根据堆栈溢出规则,这是正确的?),我可以编写指向我的github项目的链接。@flatmouse-我真正的问题更复杂,涉及模板和虚拟方法;简单地说,我想要的是保存对一个变量的引用,该变量位于类实例的内部,在调用该方法时创建;如果用户忘记了
&
,则参考将丢失,并且值(在下一阶段设置)将丢失;也许我的解决方案很愚蠢,但如果用户记住
&
,它看起来很有效。虽然很复杂,但使用起来很简单,也很好。我真正的问题涉及到模板,但应该是在模板包装中修改
int\u包装
。我会尽力的,但是+1暂时@max66我不知道为什么,但此解决方案不允许使用括号括起来的初始值设定项初始化引用,例如
int&v0{wrapValue(0)}(与值的情况类似的歧义?)。另一方面
int&v0(wrapValue(0))不会引起歧义。。。我不知道该怎么解释…很有趣;我也是(我不知道如何解释…);我想你应该提出一个问题:)