2016-07-06 3 views
-1

Почему const создает другую подпись, когда она применяется к указателю 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

thats вопрос: почему это дубликат и пример с указателями не дубликат? – chacham15

+0

@ chacham15 Компилятор может легко различать указатель на не-const и указатель-на-const. Или вы считали, что 'const test *' является указателем 'const'? – LogicStuff

+0

@LogicStuff вопрос, почему он может различать 'const test *' и 'test *', но не между 'const test' и' test'? – chacham15

Смежные вопросы