La chiamata a foo(true)
nel programma è, come dici tu, chiaramente ambigua; inoltre, è ambiguo secondo l'algoritmo presentato in § 10.2 e, di conseguenza, dovrebbe essere contrassegnato per l'uso. (La segnalazione della dichiarazione using
non è corretta, 10.2 (1) indica chiaramente che gli usi ambigui dei nomi sono segnalati alla ricerca, non alla dichiarazione.)
È interessante confrontare questo programma con uno simile, che è l'argomento di un a recognized gcc bug (leggermente modificato da tale segnalazione per rendere più chiaro il parallelo):
#include <iostream>
struct A {
static int foo() {return 1;}
static int foo(char) { return 2;}
};
struct B1 : A {
// using A::foo;
};
struct B2 : A {
// using A::foo;
};
struct C : B1, B2 {
// using B1::foo;
// using B2::foo;
};
int main()
{
std::cout << C::foo();
}
il programma precedente è corretta; nonostante l'ereditarietà del diamante, foo
è un membro statico di A
, quindi non è ambiguo. In effetti, gcc lo compila senza problemi. Tuttavia, decommentando le due istanze di using A::foo
, che non modifica nulla su foo
, fa sì che gcc produca l'errore stranamente riduplicato annotato nella segnalazione di errore. Decommentando le due dichiarazioni using
all'interno di C
, che presumibilmente innesca l'altro bug che è l'oggetto di questa domanda, maschera l'errore static function
e provoca la ricompilazione del programma.
clang sembra gestire tutte le possibili varianti di questo programma, per quello che vale.
Infine, ricordiamo che un dichiarato esplicitamente foo(bool)
entro C
(nel programma originale) vincerà su ogni foo(bool)
portato in ambito C
s' da using
dichiarazioni. Sospetto che entrambi questi bug siano il risultato di una cattiva contabilità mentre si cerca di tenere traccia delle varie dichiarazioni di funzione nello scope di ciascuna classe e nella loro provenienza individuale (come una sequenza di dichiarazioni using
e dichiarazioni di funzioni).
Build fallito su VC11. Errore di chiamata ambiguo. –
@MarkGarcia: Sì, sembra che solo GCC lo accetti.La domanda è se questo è dovuto a un errore o non è richiesta alcuna diagnostica per questo tipo di errore. –
FWIW, g ++ 4.4.3 dà un errore, ma non quando si usa 'pippo' in' main', ma su 'using's in' C' già: 'ambig.cc:9: errore: usando la dichiarazione 'usando B2 :: pippo 'è in conflitto con una precedente dichiarazione using' – us2012