Обновить:
Я опубликовал отчет об ошибке на visualstudio.com.
Поэтому я начинаю входить в шаблоны C++, и я столкнулся с этой проблемой, пытаясь предотвратить компиляцию класса шаблона с помощью static_assert
.
В принципе, ошибка static_assert
не запускается, когда она находится внутри лямбда на VS2017, используя C++ Language Standard: ISO C++ 17 Standard (/std: C++ 17).
Я также пробовал это на gcc-7, используя -std = C++ 17, и эта ошибка срабатывает. Это ошибка на VS2017 или что-то мне не хватает?
Пример кода:
#include <iostream>
#include <string>
#include <type_traits>
template<typename T, typename Enable = void>
class IntegralContainer
{
static_assert(std::is_integral<T>::value, "Type must be an integral!");
};
template<typename T>
class IntegralContainer<T, typename std::enable_if< std::is_integral<T>::value >::type >
{
private:
T _value;
public:
IntegralContainer(T value)
: _value(value)
{
}
};
int main()
{
IntegralContainer<int> int_container(1);
// static_assert message is shown here.
// > error C2338: Type must be an integral!
// IntegralContainer<std::string> str_container;
[]() {
// static_assert is not triggered here.
IntegralContainer<std::string> str_container;
}();
std::cout << "Hello World!\n";
return 0;
}