在两个语句中创建引用变量

时间:2015-07-09 16:11:26

标签: c++ reference

int x;
int& foo = x;

// foo is now a reference to x so this sets x to 56
foo = 56;

如何将语句int& foo = x;拆分为两个语句?

通过拆分,我的意思是使用两个语句,如下例所示:

int y;
int* ptr = &y;

我可以将int* ptr = &y分成两个声明指针的语句。

int* ptr;
ptr = &y; //then assigning the pointer to point to y

如何对参考做类似的事情?我也在寻找关于为什么或为什么不解释的解释?

6 个答案:

答案 0 :(得分:5)

不,这是不可能的,只有少数情况可以从草案C ++标准部分8.5.3 [dcl.init.ref]中删除参考的初始化器

  

初始化器可以省略,仅供参数参考   声明(8.3.5),在函数返回类型的声明中,in   在类定义(9.2)中声明类成员,   以及明确使用extern说明符的位置。 [例如:

int& r1; // error: initializer missing
extern int& r2; // OK
     

-end example]

至于为什么我们找到以下理由来解释为什么参考不能从The Design and Evolution of C++重置:

  

无法更改参考引用的内容   初始化。这是一旦C ++引用被初始化它就不能   以后可以提到另一个对象;它无法重新绑定。一世   在过去被r1=r2可以使用的Algol68引用所咬   要么通过r1分配给所引用的对象,要么分配给新的   参考值为r1(重新绑定r1),具体取决于r2的类型。一世   想避免在C ++中出现这样的问题。

答案 1 :(得分:4)

你不能。考虑像[Test] public async void MyTest() // ... The UT can be made async { var mock = new Mock<IAuthenticationInterface>(); mock.Setup(e => e.IsAuthorizedAsync(It.IsIn<string>("Foo"), It.IsAny<MyEvent>())) .ReturnsAsync(true) // ... Async .Verifiable(); // async calls can be awaited Assert.True(await mock.Object.IsAuthorizedAsync("Foo", null)); } 指针那样的引用:

constint& foo = x相同。

这就是为什么你可以重新分配一个引用,或者宣布一个没有值的新引用。

答案 2 :(得分:2)

不,你不能。 可能的解决方法是使用std::boost::optional<T&>或简单T*

int x;
boost::optional<int&> foo; // or int* foo = nullptr;

foo = x; // foo = &x;
// foo is now a 'reference' to x

*foo = 56; // now, we have x == 56

答案 3 :(得分:1)

有一个空指针这样的东西,但是没有空引用这样的东西。引用必须具有它引用的内容。 必须初始化。

int& r; // error

这是指针和引用之间的主要区别之一,并且是可能更喜欢在指针参数上引用引用参数(必须有效)的原因之一(可以为null)。

答案 4 :(得分:0)

你无法做到这一点。 引用应该是常量,因此您只能初始化它。

答案 5 :(得分:0)

不,必须初始化引用,因为它被声明为支持保证没有任何引用指向无处。