2017-10-19 20 views
3

Tout en essayant d'ajouter une spécialisation de modèle pour les littéraux de chaîne, j'ai remarqué une différence de comportement entre le compilateur VS 2017 et le compilateur VS 2010 (tous deux appelés de VS 2017)(Visual-) C++ inférence de type de modèle pour les littéraux de chaîne - VS 2010 vs VS 2017

C'est le code en question:

#include <iostream> 

template <typename T> 
struct foo 
{ 
    static const int a = -1; 
}; 

template <size_t n> 
struct foo<char[n]> 
{ 
    static const int a = 0; 
}; 

template <size_t n> 
struct foo<const char[n]> 
{ 
    static const int a = 1; 
}; 

template <typename T> 
int bar(const T& x) 
{ 
#pragma message (__FUNCSIG__) 
    return foo<T>::a; 
} 

int main() 
{ 
    std::cout << _MSC_VER << '\n'; 
    std::cout << bar("a") << '\n'; 
} 

Exécuter en utilisant le compilateur par défaut pour VS 2017:

int __cdecl bar<char[2]>(const char (&)[2]) 
1911 
0 

et exécuter en utilisant le compilateur VS 2010:

int __cdecl bar<const char[2]>(const char (&)[2]) 
1600 
1 

Comme vous pouvez le voir, T est inférée être const char[2] pour le vieux compilateur, mais char[2] pour le nouveau. Qu'est ce qui a changé? Est-ce un bug/bug dans Visual Studio ou le comportement correct a-t-il changé en C++ 11/C++ 14?

Essayer avec tio.run (gcc et clang), il semble que VS 2017 est juste, cela est exact?

+0

FWIW, littéraux de chaîne en C++ ont toujours été 'const char [N]', mais il est compréhensible que les VS avait comme 'char [N] pour la compatibilité' C. – chris

Répondre

1

Ceci est une correspondance de type simple.

Votre fonction prend un const T&. Si je passe un nombre entier, T sera déduit à int, donc la signature est const int&. Déduire comme const int serait seulement redondant.

Comme vous pouvez le voir, votre paramètre déjà comme const, donc il est adapté loin.

Sûrement un bug MSVC 2010 qui a été fixé au fil du temps, depuis la version plus ancienne de visual studio avait une assez faible mise en œuvre de la qualité des modèles.

+0

Merci pour clarifier - Je me demandais juste si j'ai raté quelque chose, mais en lisant votre explication rend la question semble assez stupide – Mathe172

+0

@ Mathe172 Votre question était bien formé et légitime, donc il n'y a vraiment aucun problème. –