18

starałem się ponowne typ zwracanej przez operatora w moim wleczonego typ zwracany innej funkcji, ale niestety dzyń nie akceptują toDlaczego to użycie operatora w końcowym typie powrotu jest kompilowane?

struct A { 
    int operator[](int); 
    auto at(int i) -> decltype((*this)[i]); 
}; 

Clang mówi, że moja klasa nie posiada operator []. Gcc zaakceptował mój kod. Czy mój kod jest rzeczywiście nieważny?

+0

Clang powinno być prawo, 'this' nie jest dostępna w momencie deklaracji funkcji składowej, jest ona dostępna tylko wewnątrz funkcji składowej. (§9.3.2/1 "W ciele niestatycznej funkcji składowej (9.3) słowo kluczowe" this "jest wyrażeniem prvalue [...]"). – Xeo

+0

@xeo i nie zgadzam się. jako ostatnia zmiana, komitet w Madrycie użył tego wewnątrz wstecznego typu, który jest ważny, aby ułatwić dziedziczenie stałej funkcji elementu zamykającego. –

+1

Jeśli clang mówi, że nie ma 'operator [] (int)', jest to oczywiście błędne. Więc jakie jest pytanie? Kwestią dotyczącą ważności użycia tego "tutaj" jest * inny *. Zgadzam się z Johannesem, że musi tu być ważny. – Walter

Odpowiedz

3

Powiedziałbym, że klang jest poprawny, z powodu 13.3.1.2p3 (1 punktor).

Dla jednoargumentowego operatora @ z argumentu typu, którego cv-niewykwalifikowany wersja jest T1, a dla binarnego operatora @ z lewego argumentu typu, którego cv-niewykwalifikowany wersja jest T1 i prawego operandu typu którego cv-niewykwalifikowany wersja jest T2 trzy zestawy funkcji kandydujących wyznaczonych kandydatów członkowskich nie będących członkami kandydatów i wbudowaną kandydatów, zbudowane są w następujący sposób:

  • Jeśli T1 to kompletny typ klasy, zestaw kandydatów na członków jest wynikiem kwalifikowanego wyszukiwania T1::[email protected] (13.3.1.1.1); w przeciwnym razie, zestaw kandydatów członków jest pusty.

(podkreślenie dodane przez @sehe)

+1

-1: Za bycie złym. p3 nie ma zastosowania do 'operator []'. p3 odnosi się tylko do operatorów w postaci '@ a', gdzie' @ 'jest operatorem jednoargumentowym. operator [] nie jest; jest zarządzany przez osobną sekcję. –

+2

Odpowiedzi tylko na hiperłącze są złe. Wydaje się, że wziąłeś to na zupełnie nowy poziom! Ten link jest uszkodzony przez projekt. Czy mógłbyś przynajmniej wypowiedzieć odpowiedni tekst? – sehe

+0

@Nicol Bolas Całkiem tak. Całkowicie przegapiłem, że [] zostało obsłużone przez inną sekcję. Dzięki, że mnie wyprostowałeś. – garfen

3

Wydaje się, że to błąd, dzyń, bo następnego kodu

struct A { 
    int operator[](int); 
    auto at(int i) -> decltype(this-> operator[](i)); 
}; 

kompiluje przez dzyń, jak również - http://liveworkspace.org/code/2Myghk $ 6

+0

To może być, ale to nie jest dowód. –

+0

Ktoś powiedział mi dziś wieczorem, że to nie jest błąd klang, ale nie pamiętam przyczyny :-(czy możesz pokazać ostateczny ślad akapitów, które dowodzą, że zachowanie klangów jest błędne? –

+0

@ JohannesSchaub-litb Czy powiedzieli, dlaczego to nie jest błąd klang? :) –

2

tylko do kopalni ponownie iterate i komentarz Stephane za:

Jest to oczywisty błąd w języku clang, ponieważ twoja klasa oczywiście ma operator[](int).

Niezależnie od tego, czy kod używający decltype() jest ważny, jest subtelnie inne pytanie (Powiedziałbym, że jest poprawny, ale nie może tego udowodnić).

+1

przeformułowałem pytanie. nie jestem naprawdę zainteresowany, czy treść komunikatu o błędzie jest rzeczywiście OK. jestem bardziej zainteresowany tym, czy mój kod jest poprawny C++ czy nie. Przykro mi, jeśli moje sformułowanie spowodowało zamieszanie. –

+1

wiele niepoprawnych kodów C++ wywoła niesensowne komunikaty o błędach, przy okazji :-) niektóre z bardziej widocznych kandydatów są wtedy, gdy zapomnisz gdzieś nazwy. –

Powiązane problemy