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?
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