И gcc 5.0, и clang 3.6 требуют ключевого слова typename
в следующем примере:
template<typename T>
struct B
{
typedef int Type;
};
template<int n>
struct A
{
typedef typename B<decltype(throw (int*)n)>::Type Throw;
typedef typename B<decltype(delete (int*)n)>::Type Delete;
};
Это описано в следующей формулировке стандарта C++11:
[кроме]/2
Выражение throw имеет тип void.
[выраж.удалить]/1
Операнд должен иметь указатель на тип объекта или тип класса, имеющий единственную неявную функцию преобразования в указатель на тип объекта. Результат имеет тип void.
Итак, я предполагаю, что decltype
производит void
в обоих случаях.
[expr.const]/2
Условное-выражение является основным константным выражением, если только оно не включает одно из следующих действий в качестве потенциально вычисляемого подвыражения.
новое выражение
бросок-выражение
Это предполагает, что выражение, включающее throw
или delete
, не может быть выражением-константой.
[temp.dep.type]/8
Тип зависим, если он
идентификатор простого шаблона, в котором либо имя шаблона является параметром шаблона, либо любой из аргументов шаблона является зависимым типом или выражением, зависящим от типа или значения.
обозначается
decltype(expression)
, где выражение зависит от типа
Таким образом, B<decltype(..)>
зависит только в том случае, если выражение зависит от типа.
[temp.dep.expr]/4
Выражения следующих форм никогда не зависят от типа (поскольку тип выражения не может быть зависимым):
delete cast-expression throw assignment-expression
Это говорит о том, что ни одно из выражений не может зависеть от типа.
Являются ли gcc и clang неправильными?
reinterpret_cast
также не может появляться в константном выражении, но [temp.dep.constexpr]/p3 явно указывает, что выражение, включающееreinterpret_cast
, возможно, может зависеть от значения. - person T.C.   schedule 31.12.2014decltype(..)
не является выражением. Так что вам также нужен [temp.dep.type]/9.8. Этот абзац требует только, чтобы выражение вdecltype(expression)
не было зависимым от типа, что хорошо указано дляthrow
иnew
. - person dyp   schedule 31.12.2014