2010-02-16 16 views
7

Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.construcción de objetos/Delantero declaración de la función de ambigüedad

Hola,

No fue sólo por un par de veces que he caído en un estado de construcción de objetos que no entendía, y no fue hasta hoy que noté la ambigüedad que estaba introduciendo. Explicaré cómo reproducirlo y me gustaría saber si hay alguna forma de solucionarlo (C++ 0x permitido). Aquí va.

Supongamos que hay una clase cuyo constructor toma solo un argumento, y este tipo de un argumento es otra clase con un constructor predeterminado. Por ejemplo:

struct ArgType {}; 

class Class 
{ 
public: 
    Class(ArgType arg); 
}; 

Si intento de construir un objeto de tipo Class en la pila, me sale una ambigüedad:

Class c(ArgType()); // is this an object construction or a forward declaration 
        // of a function "c" returning `Class` and taking a pointer 
        // to a function returning `ArgType` and taking no arguments 
        // as argument? (oh yeh, loli haets awkward syntax in teh 
        // saucecode) 

Yo digo que es una construcción de objetos, pero el compilador insiste en que es una declaración hacia adelante dentro del cuerpo de la función. Para usted que todavía no lo consigue, aquí hay un ejemplo totalmente funcional:

#include <iostream> 

struct ArgType {}; 
struct Class {}; 

ArgType func() 
{ 
    std::cout << "func()\n"; 
    return ArgType(); 
} 

int main() 
{ 
    Class c(ArgType()); 

    c(func); // prints "func()\n" 
} 

Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works 
{ 
    funcPtr(); 
    return Class(); 
} 

Así que, suficientes ejemplos. Alguien puede ayudarme a resolver esto sin hacer nada demasiado anti-idiomático (soy un desarrollador de bibliotecas, y la gente le gusta las bibliotecas idiomáticas).

- editar

No importa. Este es un engaño de Most vexing parse: why doesn't A a(()); work?.

Gracias, sbi.

+0

Su código se compila para mí con g ++ -, que poco es lo que cree que no debería trabajar? –

+0

No se trata de trabajar o no trabajar. El problema es que solo quería construir un objeto de tipo 'Clase' y pasarle a su constructor un objeto de tipo' ArgType' construido en línea. Pero lo reconoce como una declaración directa. Agregaré el código que quería que funcione pero no puedo, solo un segundo. –

+0

Olvídalo, Neil. Mira la respuesta de sbi, ese es exactamente mi problema. –

Respuesta

5

Esto se conoce como "análisis más irritante de C++". Consulte here, here y here.

1

Sobre la base de la "C++ 0x permitidas", la respuesta correcta es (probablemente) para cambiar la definición de:

Class c(ArgType {}); 

simple, directo y pone la carga por completo en el usuario de la biblioteca, ¡no el autor!

Editar: Sí, se invoca el ctor - C++ 0x agrega Inicialización de lista como una forma inequívoca de delimitar las listas de inicializadores. No se puede analizar incorrectamente como en la muestra, pero de lo contrario el significado es más o menos el mismo que si usara paréntesis. Consulte N3000, el tercer punto bajo §8.5.4/3. Puede escribir un ctor para recibir una lista de inicializadores como un único argumento, o los elementos en la lista de inicializadores pueden coincidir con los argumentos de ctor individualmente.

+0

Espera ... pero eso no llamaría al constructor, ¿o sí? –

+1

En realidad, eso no parece aceptable para GCC 4.4.1. Sin embargo, otras combinaciones son: 'Clase c {ArgType {}};' o 'Clase c {ArgType()};' Y agregando una versión que no es C++ 0x de invocación del constructor: 'Clase c ((ArgType())); ' – UncleBens

1

Simplifiquemos un poco.

int f1(); 

¿Qué es eso? El compilador (y yo) dice que es una declaración directa para una función que devuelve un número entero.

¿Qué tal esto?

int f2(double); 

El compilador (y yo) dice que es una declaración directa para una función que toma un argumento doble y devuelve un int.

Así Has probado esto:

ClassType c = ClassType(ArgType()); 

Mira la C++ FAQ Lite en constructors para explanations y ejemplos

Cuestiones relacionadas