Возьмем следующий минимальный пример:
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>
, и я получаю сообщение об ошибке.
T(void)
)... - person Kerrek SB   schedule 14.11.2012void(void)
— это просто условное обозначение совместимости дляvoid()
, ноvoid
на самом деле не является допустимым типом аргумента. - person Kerrek SB   schedule 14.11.2012