问题How to use operator= with a reference是基础,但措辞不同。
struct S{
int a,b;
void operator=(int i);
S(int i);
S(){};
};
S A[0x10];
S::S(int i){*this=A[i];}
void S::operator=(int i){*this=A[i];}
int main(){
//S s0=S{15,20};
S s1;s1=5;
S s2;s2=7;
S s3=9;
S s4;
// S& s5=8;
}
上面的代码我可以写:S s=5
而不是S s=A[5]
现在我需要相同的引用,以便能够写:S& s=5;
而不是{{1 }}
答案 0 :(得分:1)
您只能使用常量参考。那不是
S& s5;s5=10;
S& s6=10;
(顺便说一下这句话
S& s5;s5=10;
无效,因为引用应在其定义时初始化)
你必须写
const S& s5 = 10;
const S& s6 = 10;
答案 1 :(得分:1)
除了数字之外,您不能将5
文字用于其他用途,但您可以声明自己的用户定义的文字:
struct S
{
};
S A[10];
S& operator "" _(unsigned long long int i)
{
return A[i];
}
int main()
{
S& s = 5_;
}
答案 2 :(得分:0)
s=5
表示 s
必须与使用5
初始化的对象具有相同的值。
s=A[5]
表示 s
必须与A
的第六个元素具有相同的价值。
此外,您似乎无法理解参考文献。
引用(S&
)是指引用变量的创建。在创建它时,你必须说出它指向的变量。
S& s6=10;
在这种情况下,10
是临时变量。它很快就会消失。如果你想修改它,你应该使用引用临时(S&&
),在C ++ 11中添加。或者,您可以使用 const reference (const S&
),这在以前的标准中是可行的。
答案 3 :(得分:0)
我认为缺少的是C ++中为参考定义构造函数的可能性,而不是它自己的对象。
正如莫斯科的Vlad指出,当引用变为常量时,代码会编译,尽管结果是指刚构造的新对象(从索引为i的A复制的新S)。
为了获得所需的东西,编译器应该提供类似
的引用构造函数的可能性S&(int i){....}
但编译器(和语言 - 我不知道)并没有提供限制将构造函数重载到非引用的可能性的可能性。