在此示例代码中,func1
的类型为void (*)(int, double)
,funky
的类型为void(&)(int, double)
。
#include <iostream>
using namespace std;
void someFunc(int i, double j) {
cout << i << ":" << j << endl;
}
int main(int argc, char *argv[]) {
auto func1 = someFunc;
auto& func2 = someFunc;
cout << typeid(func1).name() << endl;
cout << typeid(func2).name() << endl;
func1(10, 20.0);
func2(10, 30.0);
}
输出显示差异:
PFvidE
FvidE
10:20
10:30
实际上,这两种类型有什么区别?
答案 0 :(得分:5)
如果您希望能够为函数指定指针,然后稍后更改指针指向的内容,请使用[TestClass]
public class IPAddressExtensionsTests
{
[TestMethod]
public void SimpleIp1()
{
var ip = IPAddress.Parse("0.0.0.15");
uint expected = GetExpected(0, 0, 0, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void SimpleIp2()
{
var ip = IPAddress.Parse("0.0.1.15");
uint expected = GetExpected(0, 0, 1, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void SimpleIpSix1()
{
var ip = IPAddress.Parse("0.0.0.15").MapToIPv6();
uint expected = GetExpected(0, 0, 0, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void SimpleIpSix2()
{
var ip = IPAddress.Parse("0.0.1.15").MapToIPv6();
uint expected = GetExpected(0, 0, 1, 15);
Assert.AreEqual(expected, ip.ToUint());
}
[TestMethod]
public void HighBits()
{
var ip = IPAddress.Parse("200.12.1.15").MapToIPv6();
uint expected = GetExpected(200, 12, 1, 15);
Assert.AreEqual(expected, ip.ToUint());
}
uint GetExpected(uint a, uint b, uint c, uint d)
{
return
(a * 256u * 256u * 256u) +
(b * 256u * 256u) +
(c * 256u) +
(d);
}
}
。如果没有,则使用引用auto fp = func
,因为您无法重新分配它:
auto& rp = func
我试图提出一个更实际的例子,说明为什么有人会这样做,下面是一些代码,它使用一组指针来根据用户输入调用一个函数(#include <iostream>
using namespace std;
int funcA(int i, int j) {
return i+j;
}
int funcB(int i, int j) {
return i*j;
}
int main(int argc, char *argv[]) {
auto fp = funcA;
auto& rp = funcA;
cout << fp(1, 2) << endl; // 3 (1 + 2)
cout << rp(1, 2) << endl; // 3 (1 + 2)
fp = funcB;
//rp = funcB; // error: assignment of read-only reference 'rp'
cout << fp(1, 2) << endl; // 2 (1 * 2)
return 0;
}
的任何元素都可以也可以在运行时更改指向另一个函数):
arr
答案 1 :(得分:0)
auto func1 = someFunc;
auto& func2 = someFunc;
假设您有另一个功能,并且您希望func2指向其他功能
void function()
{
cout<<"Hello world"<<endl;
}
所以你在下面做
func2 = function();
你得到的只是编译错误。原因是func2
是引用,一旦引用被初始化,它就无法更改。