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 esT1
, y para un operador binario@
con un operando izquierdo de un tipo cuya versión cv-no calificada esT1
y un operando derecho de un tipo cuyo tipo cv-no calificado la versión esT2
, 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 deT1::operator@
(13.3.1.1.1); de lo contrario, el conjunto de candidatos miembro está vacío .
(énfasis añadido por @sehe)