over loop instead for based c++ c++11 operator-keyword language-lawyer trailing-return-type

c++ - loop - ¿Por qué no utiliza este operador en el tipo de retorno final compilado?



iterate over vector c++ 11 (3)

Estaba intentando reutilizar el tipo de retorno de un operador en mi tipo de retorno final de otra función, pero desafortunadamente Clang no lo aceptó

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

Clang dice que mi clase no tiene un operador []. Gcc aceptó mi código. ¿Es mi código realmente inválido?


Parece que es un error de CLang, porque el siguiente código

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

compila por CLang también - http://liveworkspace.org/code/2Myghk $ 6


Solo para relanzar el mío y el comentario de Stephane:

Este es un error obvio en Clang , ya que su clase obviamente tiene un operator[](int) .

Si el código que usa decltype() es válido o no, es una pregunta sutilmente diferente (yo diría que es válido, pero no puedo probarlo).


Yo diría que el clang es correcto, debido a 13.3.1.2p3 (primera bala).

Para un operador unario @ con un operando de un tipo cuya versión cv-no calificada es T1 , y para un operador binario @ con un operando izquierdo de un tipo cuya versión cv-no calificada es T1 y un operando derecho de un tipo cuyo tipo cv-no calificado la versión es T2 , tres conjuntos de funciones de candidatos, candidatos de miembros designados, candidatos de no miembros y candidatos incorporados, se construyen de la siguiente manera:

  • Si T1 es un tipo de clase completo, el conjunto de miembros candidatos es el resultado de la búsqueda calificada de T1::operator@ (13.3.1.1.1); de lo contrario, el conjunto de candidatos miembro está vacío .

(énfasis añadido por @sehe)