2017-05-29 1 views
1

J'ai rencontré un comportement étrange (à mes yeux) de vecteur :: emplace_back() dans gcc (version 6.3.1). Il implicite implicitement un type à un autre même si l'opérateur de conversion déclaré comme explicite.Conversion implicite pour opérateur explicite

class A 
{ 
public: 
    explicit A(double value) : 
     value{value} 
    {} 

    explicit operator double() const 
    { 
     return value; 
    } 

private: 
    double value; 
}; 

int main() 
{ 
    A a{0.0}; 
    std::vector<double> values; 
    values.emplace_back(a); // <- no error here!  

    return 0; 
} 

Est-ce un bug ou une fonctionnalité?

+0

'emplace_back' builds explicitement du paramètre donné. – Jarod42

+0

Vous obtiendrez une erreur avec 'push_back' cependant. – Jarod42

Répondre

1

Il est fondamentalement comme Jarod42 a écrit dans les commentaires, mais voici quelques détails.

Le emplace_back method emplaces un élément qui

est construit par std :: allocator_traits :: construire

Si vous regardez construct, vous pouvez le voir utilise placement new. Il s'agit essentiellement de quelque chose comme

new((void *)p) T(val) 

qui est un appel ctor explicite.

0

de l'ISO [class.conv.fct]:

Une fonction de conversion peut être explicite (7.1.2), auquel cas il est considéré comme ne une conversion définie par l'utilisateur pour l'initialisation directe- (8,5). Sinon, les conversions définies par l'utilisateur ne sont pas limitées à l'utilisation de dans les affectations et les initialisations.

double b { A { .0 } }; // fine 
double d = A { .0 }; // wrong