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
如何对参考做类似的事情?我也在寻找关于为什么或为什么不解释的解释?
答案 0 :(得分:5)
不,这是不可能的,只有少数情况可以从草案C ++标准部分8.5.3
[dcl.init.ref]中删除参考的初始化器1} EM>:
初始化器可以省略,仅供参数参考 声明(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));
}
指针那样的引用:
const
与int& 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)
不,必须初始化引用,因为它被声明为支持保证没有任何引用指向无处。