문자열 리터럴에 대한 템플릿 전문을 추가하는 동안 VS 2017 컴파일러와 VS 2010 컴파일러 (둘 다 호출되는 VS 2017의 기본 컴파일러를 사용하여(Visual-) C++ 문자열 리터럴에 대한 템플릿 형식 유추 - VS 2010 VS VS 2017
#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';
}
실행 :
VS 2017)에서int __cdecl bar<char[2]>(const char (&)[2]) 1911 0
이 문제의 코드는 은 VS 2010 컴파일러를 사용하여
실행 :
int __cdecl bar<const char[2]>(const char (&)[2]) 1600 1
당신이 볼 수 있듯이이 T
은 새로운 하나에 대한 이전 컴파일러에 대한 const char[2]
하지만 char[2]
것으로 추정된다. 무엇이 바뀌 었습니까? 이것은 Visual Studio의 버그 수정/버그입니까? 아니면 C++ 11/C++ 14에서 올바른 동작이 변경 되었습니까?
tio.run (gcc와 clang 모두)으로 시도하면 VS 2017이 맞을 것으로 보입니까? 맞습니까?
FWIW, C++의 문자열 리터럴은 항상'const char [N]'입니다. 그러나 VS가 C 호환성을 위해'char [N]'을 가지고 있다면 이해할 수 있습니다. – chris