C ++中void(*)()和void(&)()之间的区别

时间:2015-05-31 18:18:21

标签: c++ pointers

在此示例代码中,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

实际上,这两种类型有什么区别?

2 个答案:

答案 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是引用,一旦引用被初始化,它就无法更改。