2016-10-21 1 views
4
  • Pourquoi le code suivant échantillon ne produisent pas d'ambiguïté
  • Est-il possible d'appeler la deuxième version? (Si ce n'est pas un bug)

#include <iostream> 
using namespace std; 

void foo(const int*){cout << "no ref";} 
void foo(const int*&){cout << "on ref";} 

int main() 
{ 
    int* i=nullptr; 
    foo(i); 
} 

EDIT:const T * & T * et const ne produisent pas d'ambiguïté sur la surcharge de fonction

Ce

#include <iostream> 
using namespace std; 

void foo(const int){cout << "no ref";} 
void foo(const int&){cout << "on ref";} 

int main() 
{ 
    int i=0; 
    foo(i); 
} 

Do produire l'ambiguïté.


Par ailleurs, supprimer l'ambiguïté de produire const.

compilateur

: g ++ 5.3.0 avec le drapeau --std = C++ 14

Répondre

4
  • Pourquoi le code exemple suivant ne produisent pas d'ambiguïté

Ce n'est pas un bug. Le type du paramètre est const int*&, il s'agit d'une référence à non-const, qui ne peut pas être lié à un objet de type différent (int*). (Un convertion implicite est nécessaire, et le temporaire produit ne peut pas être lié à la référence à la non-const.)

Si vous changez le type de paramètre de référence à const:

void foo(const int* const&) 

Ou changer l'argument de tapez à const int*:

const int* i=nullptr; 
foo(i); 

deux déclenche une erreur de compilation pour les appels ambigus.

  • Est-il possible d'appeler la deuxième version? (Si ce n'est pas un bug)

Vous pouvez le faire via un pointeur de fonction, en spécifiant explicitement laquelle vous voulez ramasser:

const int* i=nullptr; 
static_cast<void(*)(const int*&)>(&foo)(i); 
+0

Oh, vous avez raison. BTW, puis-je appeler la deuxième version? –

+0

Et pouvez-vous également me dire pourquoi, pour un type non-pointeur, cela produit une ambiguïté? –

+0

@appleapple Voir ma version modifiée Et qu'entendez-vous par "type non-pointeur"? – songyuanyao