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))代码>不会引起歧义。。。我不知道该怎么解释…很有趣;我也是(我不知道如何解释…);我想你应该提出一个问题:)