Следующий код компилируется с сообществом VS15 и выводит "Hello".
#include <functional>
#include <iostream>
template<typename T>
using void_template_alias_t = void;
template<typename T>
using Func = std::function<void( T )>;
template<typename T>
using FuncVoid = Func<void_template_alias_t<T>>;
int main()
{
FuncVoid<void> hello = [] { std::cout << "Hello\n"; };
hello();
}
Я думаю, что это не разрешено компилировать.
Я играл, код был немного сложнее. Я наивно ожидал, что это сработает, но вдруг понял, что этот код не должен компилироваться, потому что вы не можете сделать Func<void>
(или я ошибаюсь в этом?).
- Я нашел волшебное обходное решение?
- Это новое поведение из стандарта С++ 14?
- Или это просто ошибка компилятора?
Изменить: Следующая упрощенная версия не компилируется.
#include <functional>
#include <iostream>
template<typename T>
using Func = std::function<void( T )>;
int main()
{
Func<void> hello = [] { std::cout << "Hello\n"; };
hello();
}
- Так почему же код выше компилируется и работает, как я и ожидал?
- Это правильная реализация, если нет, как бы она выглядела?