2010-08-31 14 views
11

const y volatile se llaman cv-qualifier por la especificación C.¿Correlación entre especificador y calificador?

¿Qué es exactamente la diferencia entre specifier y qualifier (cv-qualifier)? ¿Es un calificador también un especificador?

¿Es necesario que qualifier esté con un lvalue solamente?

¿Qué son los calificadores distintos de cv-qualifier?

¿Mi comprensión anterior tiene algún sentido?

Respuesta

6

La mayor parte no tiene sentido.

Especificador y calificador se definen en la norma C++. Calificador es solo una parte integral de un especificador. Por ejemplo, tipo especificador en una declaración puede incluir cv-calificadores. No veo la razón para citar todo el estándar sobre este tema.

Cv-calificadores no están restringidos a lvalues. Los valores R de clase también pueden ser calificados por el cv. Es posible cv-calificar un valor r de tipo no de clase, pero no tendrá ningún efecto y se ignorará.

El uso de const calificador que usted muestra en su ejemplo con foo es sólo una forma sintáctica, que en realidad significa que la const-calificativo se aplica a la implícita this parámetro del método foo: const A* this. Es decir. en este caso sí califica un lvalue, pero es *this, no foo.

El término calificador también aparece en el contexto de nombres cualificados. Nombre como some_class::some_member (o some_namespace::some_name) se llaman nombres calificados y la parte some_class:: es calificador.

La idea de que si algo es un lvalue, entonces puede modificarlo es totalmente incorrecto. Hay modificables lvalues ​​y no modificables lvalues. Un objeto declarado como const int i = 5 es un lvalue, pero no puede modificarlo. Las funciones ordinarias también son valores en C++, pero no se puede modificar una función.

+1

+1 para "No veo el motivo para citar todo lo que se encuentra en el estándar sobre este tema". A veces me pregunto si la gente piensa que la simple inclusión de alguna cita aleatoria estándar hace que su respuesta sea menos incorrecta (no estoy hablando de este hilo, pero hay muchos hilos de respuesta divertidos sobre SO, por desgracia, ese es el caso). –

+1

Oye, alguien probó lo que dije ayer: http://meta.stackexchange.com/questions/51469/dont-forget-to-mention-sql-injection/51474#51474 –

3

Un cv-calificador es un especificador, realmente un tipo especificador.

citando C++ 03 7,1:

Los especificadores que se pueden utilizar en una declaración son

decl-specifier: 
    storage-class-specifier 
    type-specifier 
    function-specifier 
    friend 
    typedef 
decl-specifier-seq: 
    decl-specifier-seq_opt 
    decl-specifier 

... mientras especificadores de tipo se definen:

type-specifier: 
    simple-type-specifier 
    class-specifier 
    enum-specifier 
    elaborated-type-specifier 
    cv-qualifier 

En cuanto a la distinción entre el verificador de palabras y el calificador:

Cada tipo que es una incompleta tipo de objeto cv-no calificado completa o o es nula tiene tres versiones CV-cualificado de su tipo correspondiente: una versión const cualificado, una versión volátil cualificado, y una const-volatile-qualified version. El tipo de objeto de término incluye los calificadores cv especificados cuando se crea el objeto . La presencia de un especificador const en un decl-specifier-seq declara un objeto del tipo de objeto const-calificado; tal objeto se llama objeto const. La presencia de un especificador volátil en un decl-specifier-seq declara un objeto del tipo de objeto calificado como volátil; dicho objeto se denomina objeto volátil . La presencia de ambos cv-calificadores en un decl-specifier-seq declara un objeto de tipo de objeto const-volátil-calificado; dicho objeto se llama objeto const volátil . Las versiones cv-no calificadas cv-qualified o de un tipo son tipos distintos; sin embargo, deberán tener la misma representación y requisitos de alineación.

Si bien no se indica claramente, el párrafo anterior muestra la diferencia. Admito que las definiciones podrían ser más estrictas sin embargo.

+1

Gracias por la respuesta precisa. En el párrafo que cita, me confundió el uso mixto de ambas palabras: "... La presencia de un especificador const ** en un especificador de declinación-seq ... ... La presencia de un especificador ** volátil ** en un decl-specifier-seq ... ... La presencia de ambos ** cv-qualifiers ** en un decl-specifier-seq ... ". Y como no hay definiciones gramaticales cerca de este párrafo, no es obvio si "const" y "volátil" son especificadores o calificadores (o calificador es un caso específico de especificador o viceversa). Gracias de nuevo. –

Cuestiones relacionadas