Pytanie Dlaczego kwalifikator typu w typie zwracanym jest bez znaczenia?


Powiedzmy, że mam ten przykład:

char const * const
foo( ){
   /* which is initialized to const char * const */
   return str;
}

Jaki jest właściwy sposób, aby uniknąć ostrzeżenia kompilatora "kwalifikator typu na typ powrotu jest bez znaczenia"?


21
2017-10-22 13:27


pochodzenie


Czy to tylko ja lub to pytanie nie ma jasności? - jldupont
@ Jean-Lou: Zgadzam się, że samo pytanie jest nieco niejasne, ale tytuł pytania akcentuje jego znaczenie. - sbi


Odpowiedzi:


Sposób, w jaki to napisałeś, mówi "zwrócona wartość wskaźnika jest stała". Ale wartości r class nie klasy nie są modyfikowalne (odziedziczone z C), a zatem Standard mówi, że r wartości typu "non-class" nigdy nie są const-kwalifikowane (right-most const został zignorowany nawet przez ciebie), ponieważ const byłby trochę zbędny . Tego się nie pisze - przykład:

  int f();
  int main() { f() = 0; } // error anyway!

  // const redundant. returned expression still has type "int", even though the 
  // function-type of g remains "int const()" (potential confusion!)
  int const g(); 

Zauważ, że dla typu "g", const jest znaczące, ale dla wyrażeń rvalue generowanych z typu int const const jest ignorowane. Oto więc błąd:

  int const f();
  int f() { } // different return type but same parameters

Nie ma sposobu, by mi wiadomo, że można zaobserwować "const" inne niż uzyskanie samego typu "g" (i przemijanie &f do szablonu i na przykład wyprowadzić jego typ. Na koniec zauważ, że "char const" i "const char" oznaczają ten sam typ. Polecam ci ustalenie jednego pojęcia i użycie go w całym kodzie.


22
2017-10-22 13:31



Polecam używanie zawsze ciągłego "const" (char const * const), ponieważ jest to jedyny sposób użycia "const" konsekwentnie. Jednak jestem źle przeciwny w tym ... - DevSolar
@DevSolar: Większość guru (na przykład Sutter) wydaje się zgadzać z tobą i umieszczać kwalifikatory PO typie (klasa const i klasa volatile). - Matthieu M.
@DevSolar, aby wyjaśnić: nie zgadzają się z tobą na temat ostatniej ciągłej stałej. Mogą zgodzić się z twoją pierwszą const, która pojawia się po nazwie typu. - Johannes Schaub - litb
@Dev, mam na myśli, że nie zgadzają się z tym int const f() jest dobry. Pominą tę ostatnią stałą (zauważ, że to nie to samo co int f() const - to zupełnie inna sprawa). Matthieu (i ja też) zgadza się z tobą w tym const po rodzaju jest w porządku (np int const a = 0;). Ale nie to, że jest dobre jako ciągłe const w typach zwracanych funkcji (jako komentarz może wskazać - więc chciałem wyjaśnić). - Johannes Schaub - litb
Ahh ... teraz rozumiem. Rzeczywiście nie miałem na myśli końca stałej zwracanej przez funkcję, ale po prostu zawsze używam końcowe const gdzie const jest właściwe (który int const f() nie jest). - DevSolar


W języku C, ponieważ wartości zwracane przez funkcje i wartości kwalifikujące są bez znaczenia.
Może być inny w C ++, sprawdź inne odpowiedzi.

const int i = (const int)42; /* meaningless, the 42 is never gonna change */
int const foo(void); /* meaningless, the value returned from foo is never gonna change */

Tylko obiekty mogą mieć znaczące kwalifikacje.

const int *ip = (const int *)&errno; /* ok, `ip` points to an object qualified with `const` */
const char *foo(void); /* ok, `foo()` returns a pointer to a qualified object */

4
2017-10-22 13:42



Zwróć uwagę, że w przypadku typów klas: const dla zwracanych wartości nie ma znaczenia, ponieważ możesz wywoływać funkcje modulujące składowe na nieregulowanych wartościach r. (Mieliśmy to tutaj ze strunami innego dnia: (s1+s2).append(s3).) Jak zwykle odpowiedź litb wyjaśnia to wszystko zarówno szczegółowo, jak i poprawnie. - sbi
Miałem na myśli moją odpowiedź, aby poradzić sobie tylko z C. Zaktualizowano, aby to odzwierciedlić. - pmg
Ach, zadał pytanie "C / C ++". (Dziwny język, to.) Przepraszam, ja też tego nie widziałem. - sbi


Żadna z poprzednich odpowiedzi nie stanowi odpowiedzi na "właściwą drogę".

Wierzę, że odpowiedź na to jest:

char const * foo( ){

co oznacza, że ​​zwracasz wskaźnik o stałej postaci.


2
2018-04-10 22:51



Rozumiem, że jest to stały wskaźnik do znaku, a nie wskaźnik do stałego znaku - atlex2
Nie, właściwie @ user1076543 ma rację, jest wskaźnikiem stałego znaku jako char const * i const char * są takie same. Stały wskaźnik do postaci będzie char * const. - Baris Demiray