29 votes

La conversion vers un pointeur vers un modèle instancie-t-elle ce modèle?

static_cast<the_template<int>*>(0) - est-ce instancier the_template type int?

La raison de la demande est le suivant code d'erreur au temps de lien avec une référence non définie à l' check_error<char>(void*, long) avec Clang et GCC 4.4.5, indiquant qu'il n'a pas d' instancier le modèle. MSVC et GCC 4.5.1 cependant compiler et lier correctement, conduisant à le croire qu'il n' instancier le modèle. Toutefois, si vous laissez le plâtre, MSVC et GCC (les deux 4.4.5 et 4.5.1) l'erreur check_error<char> seulement (le comportement souhaité), tandis que Clang l'erreur sur les deux appels. Normalement je crois que Clang quand il s'agit de se conformer trucs, mais je me demande:

Le compilateur est correct et ce qui ne le standard de dire à ce sujet?


#include <type_traits>

template<class T>
void check_error(void*, long);

template<class T>
struct foo{
  template<class U>
  friend typename std::enable_if<
    std::is_same<T,U>::value
  >::type check_error(foo<T>*, int){}
};

template struct foo<int>;

int main()
{
  check_error<int>(static_cast<foo<int>*>(0), 0);
  check_error<char>(static_cast<foo<char>*>(0), 0);
}

17voto

Johannes Schaub - litb Points 256113

Ce n'est pas le transtypage qui instancie la spécialisation de modèle de classe, mais l'appel de fonction, car l'argument déclenche ADL. L'instanciation est effectuée car son exhaustivité peut affecter la sémantique du programme.

Ce bruit ne suit pas les spécifications ici est connu et un PR a été envoyé par moi il y a quelque temps. Voir http://llvm.org/bugs/show_bug.cgi?id=9440

8voto

Dave Points 10916

n3242 §14.7.1/1

À moins qu'un modèle de classe spécialisation a été instancié explicitement (14.7.2) ou explicitement spécialisés (article 14.7.3), la classe template de la spécialisation est implicitement instancié lors de la spécialisation est référencé dans un contexte qui nécessite un tout type d'objet défini ou lorsque l'intégralité de la classe type affecte la sémantique de le programme. L'implicite de l'instanciation d'une classe template de la spécialisation des causes de l'implicite l'instanciation des déclarations, mais pas de définitions ou des arguments par défaut, les fonctions de membre de classe, catégories de membres, les données membres statiques et modèles de membre; et il provoque l'instanciation implicite de la définition de " membre anonyme syndicats. À moins qu'un membre d'un modèle de classe ou un membre de modèle a été instancié explicitement ou explicitement spécialisés, la spécialisation du membre est implicitement instancié lorsque la spécialisation est référencé dans un contexte qui exige la définition du membre d'exister; dans en particulier, l'initialisation (et de tous les effets indésirables liés) d'une donnée membre statique ne pas se produire à moins que la donnée membre statique est utilisée d'une manière qui exige la définition de la donnée membre statique d'exister.

Il me semble qu' static_cast nécessiterait l'instanciation des déclarations, mais pas des définitions (que vous êtes tout simplement traitant avec les pointeurs).

n3242 §14.6.5/1

Ami des classes ou des fonctions peut être déclarée à l'intérieur d'un modèle de classe. Lorsqu'un modèle est instancié, l' les noms de ses amis sont traités comme si la spécialisation a été explicitement déclaré à son point d'instanciation.

Je pense qu'il devrait le lien, mais peut-être que quelqu'un d'autre peut l'interpréter mieux que je peux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X