我担心这是一个愚蠢的问题,但是......
有人可以建议我强制一个函数(或方法)的返回值,它返回对内部静态变量或类/结构的成员的引用,只分配给引用变量?
我尝试用最小的例子来解释我的愿望。
给定以下代码,函数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 ++标准不可能,我担心,有人可以建议我另一种方式(但不是太复杂:我打算在我想保持简单的库中使用它)禁止一个无限的任务?
答案 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
}
答案 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()复制返回值,因此您最终会遇到同样的问题。它感觉真的很笨拙而且很好。