2017-10-06 4 views
8

Prenons un exemple:Est-il garanti que la déduction prévue utilisateur Invoke des paramètres du modèle de modèle guide

#include <type_traits> 
#include <string> 

template <template <class> class TT> //#1 
struct Foo { 
    static void foo() { 
     static_assert(std::is_same_v<decltype(TT("abc")), TT<std::string>>); 
    } 
}; 

template <class T> 
struct Bar { 
    Bar(T) {} 
}; 

template <class T> 
Bar(T) -> Bar<std::string>; //#2 

int main() { 
    Foo<Bar>::foo(); 
} 

[clang] ainsi que [gcc] les deux semblent utiliser des guides de déduction fournis par l'utilisateur (# 2) lorsque déduisant le paramètre de modèle de modèle paramètre de modèle (# 1). Est-ce une fonctionnalité conforme aux normes?

Répondre

4

Oui, ceci est conforme aux normes.

Selon [dcl.type.simple]/2:

Un type spécificateur du formulaire typename optimbriqué-name-spécificateur optmodèle nom est un espace réservé pour un type de classe déduite ([dcl.type.class.deduct]). Le nom de modèle doit nommer un modèle de classe qui n'est pas un nom de classe injecté.

Et [temp.param]/3:

Un type paramètre dont l'identifiant ne suit pas une ellipse définit son identificateur comme une typedef-name (si déclarée sans template) ou modèle-name (si déclaré avec template) dans la portée de la déclaration de modèle.

TT est un paramètre de type déclaré avec template, ce qui en fait un modèle nomet donc un espace réservé pour un type de classe déduite. Toutes les règles habituelles s'appliquent très bien.

+0

Je m'attendais vraiment à cette réponse, mais si cela se passait mal ... eh bien je vais le reprendre;) –

+0

comme petite question: vous pensez que les guides de déduction automatique ne devraient pas être appliqués non plus? –

+0

@ W.F. Ok, j'ai complètement renversé la réponse :) – Barry