Тип параметра шаблона нетипичного типа изменяется случайным образом - PullRequest
11 голосов
/ 04 июля 2019

Я не уверен, является ли это ошибкой компилятора, или я сделал что-то, что идет вразрез со стандартом, чтобы вызвать неопределенное поведение.Вот мой код:

#include <iostream>
template<auto InputSize, typename SizeType = decltype(InputSize)>
class StaticArray
{
public:
    using size_type = SizeType;
    using size_type2 = decltype(InputSize);
};

int main()
{
    //StaticArray<2, int> s1;
    StaticArray<2ull, int> s3;
    std::cout << typeid(decltype(s3)::size_type).name() << "\t" << typeid(decltype(s3)::size_type2).name() << "\n";
    return 0;
}

Если закомментированная строка остается закомментированной, я получаю правильный вывод: int unsigned __int64.Однако, если я раскомментирую строку, я получу вывод int int.Для справки я собираю это в отладке x86, на MSVC 2017 v15.9.2.

1 Ответ

5 голосов
/ 04 июля 2019

Похоже, ошибка компилятора, см. https://godbolt.org/z/k2ng-1. Если версия MSVC меньше или равна 19.16, у вас есть проблема, которую вы показали, с 19.20 все работает нормально.

Редактировать: под тестовым кодом в случае разрыва ссылки в будущем:

#include <type_traits>

template<auto InputSize, typename SizeType = decltype(InputSize)>
class StaticArray
{
public:
    using size_type = SizeType;
    using size_type2 = decltype(InputSize);
};

int main()
{
    StaticArray<2, int> s1;
    StaticArray<2ull, int> s3;

    static_assert(std::is_same_v<decltype(s3)::size_type, int>, "ERROR 1");
    static_assert(std::is_same_v<decltype(s3)::size_type2, unsigned long long>, "ERROR 2");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...