2016-07-06 91 views
-1

为什么const在应用于struct指针而不是struct时创建不同的签名?为什么const有时是函数签名的一部分?

E.g.

typedef struct test_s { 
    int foo; 
} test; 

void foo(test *ptr){ 
    return; 
} 

// This is ok 
void foo(const test *ptr){ 
    return; 
} 

void foo(test t){ 
    return; 
} 

//This is an error 
void foo(const test t){ 
    return; 
} 

(上gcc版本4.9.2测试)

更具体而言,这是为什么认为底部一个是错误时,一对与该指针不是错误。引用的重复问题(Functions with const arguments and Overloading)似乎也会争辩说指针的情况应该是重复的。

+0

根据该函数可以采用的参数来考虑。最后2个可以采用完全相同的参数,最后一个只是任意决定使其内部副本保持不变(实现细节)。第一个不能指向常量,所以它们真的是不同的功能,从外部看。 –

回答

1
void foo(const test t){ 
    return; 
} 

是错误的,因为它是一样的:

void foo(test t){ 
    return; 
} 

这使得先前的功能的副本。


当函数参数是test*,你可以取消引用指针和修改。修改将在调用函数中可见。

void foo(test *ptr){ 
    ptr->foo = 10; // The state of the object in the calling function 
        // is changed. 
    return; 
} 

当函数参数为const test*,你可以取消引用指针来访问它,但不能修改它。

void foo(const test *ptr){ 
    std::cout << ptr->foo << std::endl; // OK 
    ptr->foo = 10;      // Not OK 
    return; 
} 

出于同样的原因,你可以重载:

void foo(test& t); 
void foo(const test& t); 

当您尝试过载

void foo(test t); 
void foo(const test t); 

二者都同样是很好的候选人,当你调用它。编译器无法消除这两者之间的歧义。另外,请看one of the answers to the dupe。它引用了C++标准的部分内容,说明为什么最后两个是相同的。

+2

多数民众赞成在这个问题:为什么这是一个重复的例子与指针不重复? – chacham15

+0

@ chacham15编译器可以轻松区分指向非常量指针和指向常量指针。或者你认为'const test *'是一个'const'指针? – LogicStuff

+0

@LogicStuff问题是为什么可以区分'const test *'和'test *',而不是'const test'和'test'之间的区别? – chacham15

相关问题