C ++ - Dlaczego statyczna funkcja członkowska nie może zostać utworzona z kwalifikatorem „const”

86

Dzisiaj mam problem. Potrzebuję staticfunkcji członka, constnie jest to konieczne, ale lepsze. Ale nie udało mi się. Czy ktoś może powiedzieć, dlaczego lub jak?

prabhakaran
źródło
1
Co constoznaczałaby dla Ciebie statyczna funkcja członkowska?
GManNickG,
2
@GMan Mam na myśli to, że statyczna funkcja członkowska, która nigdy nie zmienia żadnego ze swoich danych wejściowych.
prabhakaran
11
Wtedy twoje dane wejściowe (parametry funkcji) powinny być podane przez wartość lub odwołania do stałych.
GManNickG,
3
I tak nie wpływa na stałość argumentów funkcji składowych. Nie oznacza „uczyń wszystko stałym”, oznacza „uczyń to stałym”.
UncleBens
@GMan, czy mówisz, że const musi zostać dodane do argumentów
prabhakaran

Odpowiedzi:

137

Kiedy stosować constkwalifikator do nonstatic funkcji składowej, to wpływa na thiswskaźnik. Dla wykwalifikowanych const funkcji członka klasy C, thiswskaźnik jest typu C const*, podczas gdy dla funkcji członka, który nie jest const wykwalifikowanych The thiswskaźnik jest typu C*.

Statyczna funkcja składowa nie ma thiswskaźnika (taka funkcja nie jest wywoływana w konkretnym wystąpieniu klasy), więc kwalifikacja const statycznej funkcji składowej nie ma żadnego sensu.

James McNellis
źródło
Czy to oznacza, że ​​„const” dotyczy tylko zmiennych takich jak int, wskaźnik itp.?
prabhakaran
@prabhakaran - Funkcje składowe również mogą być kwalifikowane jako const . James wyraźnie wspomniał o tym w swojej odpowiedzi.
Mahesh
Kwalifikator const funkcji @Mahesh również kwalifikuje tylko „ten wskaźnik”, a nie całość. Nadal można zmienić zmienną globalną w ramach funkcji składowej o stałej kwalifikowanej. Teraz tylko ja to sprawdziłem.
prabhakaran
5
-1 "Statyczna funkcja składowa nie ma tego wskaźnika ... więc kwalifikacja const statycznej funkcji składowej nie ma żadnego sensu [w ten sposób]" jest sama w sobie prawdziwa, ale jest błędna jako odpowiedź na pytanie "dlaczego ”. Jako odpowiedź zakłada, że ​​znaczenie constmusiałoby być takie samo dla elementu statycznego, jak dla elementu niestatycznego. Jako przykład, którego to myślenie nie ma, rozważ znaczenie static, które zależy od kontekstu.
Pozdrawiam i hth. - Alf
2
Czy to jest C const*czy const C*?
crisron
24

Zgadzam się z twoim pytaniem, ale niestety C ++ jest tak zaprojektowane. Na przykład:

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

Na dzień dzisiejszy rozpatrywany constjest w kontekście this. W pewnym sensie jest wąski. Można go poszerzyć, stosując to constpoza thiswskaźnikiem.
tzn. „proponowany” const, który może mieć również zastosowanie do staticfunkcji, ograniczy staticczłonkom możliwość dokonywania jakichkolwiek zmian.

W przykładowym kodzie, jeśli foo()można wykonać const, to w tej funkcji A::snie można go modyfikować. Nie widzę żadnych efektów ubocznych języka, jeśli ta reguła jest dodana do standardu. Wręcz przeciwnie, zabawne jest to, dlaczego taka zasada nie istnieje!

iammilind
źródło
8
Prawdopodobnie to samo, co powód, dla którego nie można zmodyfikować stałej funkcji dowolnej tak, aby oznaczała, że ​​„ta funkcja nie modyfikuje żadnych zmiennych globalnych”. constdotyczy obiektu (w przypadku funkcji składowych stałych, instancji, na której jest wywoływana). Jeśli chcesz, aby dotyczyło to wszystkich statycznych członków klasy, domyślam się, że jeśli w ogóle było to rozważane przez komitet, to nie uważano, że jest to wystarczająco powszechny wymóg wsparcia.
Steve Jessop
1
constModyfikator nie stosuje się metod członkowskich lub zmiennych składowych, ale niejawnego this-pointer. Ponieważ statyczna metoda thisskładowa nie jest powiązana z obiektem, nie ma -pointer do wykonania const.
Ruud Althuizen
1

Nie wchodząc w szczegóły, dzieje się tak dlatego, że może istnieć obiekt zmodyfikowany przez funkcję lub nie, więc const jest niejednoznaczne dla kompilatora.

Przypomnij sobie, że constobiekty są stałe, ale może istnieć obiekt, który ma być stały, ale nie musi.

Don Larynx
źródło
2
„może lub nie”? Statyczna funkcja składowa nigdy nie ma thiswskaźnika. (Poza tym constnie utrzymuje stałych obiektów. Zapobiega użyciu określonego wskaźnika lub odniesienia do modyfikacji obiektu, ale modyfikacja może nadal nastąpić za pośrednictwem innej ścieżki)
Ben Voigt
1

Szkoda, że ​​C ++ nie akceptuje tego zgodnie z projektem, ale logicznie jest kilka przypadków użycia, w których sprawdza się dobrze.

Funkcja, która jest prawidłowa na poziomie klasy (statyczna), może nie zmieniać żadnych danych statycznych, być może będzie to po prostu dane zapytania, które powinny być stałe. Może tak powinno być

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Raghavendar Reddy
źródło
1

„Stała funkcja składowa” nie może modyfikować obiektu, do którego jest wywoływana, ale statyczne funkcje składowe nie są wywoływane w żadnym obiekcie. Jest używany bezpośrednio przez operatora rozpoznawania zakresu. Zatem posiadanie stałej statycznej funkcji składowej nie ma sensu, dlatego jest nielegalne.

nihal dixit
źródło