Возьмем следующий минимальный пример:
using Type1 = std::function<void(void)>;
template <typename T>
using Type2 = std::function<void(T)>;
Type1 whyDoesThisWork;
Type2<void> andYetThisDoesNot;
Если второй псевдоним типа, я получаю ошибку "Аргумент может не иметь" void "типа". (Я тестировал с Xcode 4.5, Clang/С++ 11/libС++, OS X 10.7.)
Мне это любопытно: я бы ожидал, что Type1
и Type2<void>
будут вести себя одинаково. Что здесь происходит? И есть ли способ переписать псевдоним второго типа, чтобы я мог написать Type2<void>
и получить std::function<void(void)>
вместо ошибки?
Изменить. Я должен добавить, что причина, по которой я хочу, - это разрешить следующее:
template <typename ... T>
using Continuation = std::function<void(T...)>;
auto someFunc = []() -> void {
printf("I'm returning void!\n");
};
Continuation<decltype(someFunc())> c;
Continuation<decltype(someFunc())>
становится Continuation<void>
, и я получаю ошибку.