2012-07-03 23 views
21

En [dcl.attr.depend]/1, leo:En C++ 11, ¿cómo especifico que el "implícito" parámetro "[[carries_dependency]]"?

El atributo [...] carries_dependency [...] se puede aplicar a la declarator-id de un parameter-declaration en una declaración de la función o lambda, en cuyo caso especifica que la inicialización del parámetro conlleva una dependencia a (1.10) cada conversión de valor l a valor r (4.1) de ese objeto. El atributo también se puede aplicar al declarator-id de una declaración de función , en cuyo caso especifica que el valor de retorno, si lo hay, conlleva una dependencia a la evaluación de la expresión de llamada de función.

Lo que me falta es una forma de aplicar el atributo al parámetro this implícito.

A modo de ejemplo, considere esta función gratuita:

void fun(int i, Foo * [[carries_dependency]] f); 

y es equivalente (pero para el atributo) Versión miembro de:

void Foo::fun(int i); // can't add [[carries_dependency]] here? 
+1

Estoy seguro de que se puede hacer, pero tendrá que buscar la sintaxis en el estándar. Puedo intentar adivinar que será algo así como '[[carries_dependency]] void fun (int);' o 'void fun (int) [[carries_dependency]];' en la declaración. –

+0

@David Rodríguez - dribeas Si estoy leyendo la gramática correcta, la primera aplica el atributo a los valores de retorno de la función (si corresponde) mientras que la segunda no está permitida. –

+0

@MarkB: 8.4.1p2 parece indicar que los atributos de la función deben ser los últimos elementos en la declaración de la función. –

Respuesta

3

no estoy seguro y no tienen un compilador con soporte para esto para probar, pero hay una posibilidad: creo que la gramática [gram.decl] indica que deberías poder ponerla ("attribute-specifier_opt") en el mismo lugar que colocarías " const "para indicar una constante este puntero (" cv-qualifier-seq_opt "), que tendría sentido:

parameters-and-qualifiers: 
    (parameter-declaration-clause) attribute-specifier_opt cv-qualifier-seq_opt 
     ref-qualifier_opt exception-specification_opt 

E.g.

struct X{ 
    void f(int i) [[carries_dependency]]; 
}; 
+0

No es nada sorprendente, cuando se compara con los miembros 'const',' = default', etc. – sehe

Cuestiones relacionadas