enum class E {
One,
Two
};
void foo(E value = decltype(value)::One) {
}
Его можно скомпилировать с помощью Clang (3.9), но нельзя скомпилировать с помощью GCC 6.1: value was not declared in this scope
.
Какой компилятор правильный?
enum class E {
One,
Two
};
void foo(E value = decltype(value)::One) {
}
Его можно скомпилировать с помощью Clang (3.9), но нельзя скомпилировать с помощью GCC 6.1: value was not declared in this scope
.
Какой компилятор правильный?
Согласно [basic.scope.pdecl]/1:
Точка объявления имени находится сразу после его полного декларатора (пункт 8) и перед его инициализатором (если есть), за исключением отмеченных. ниже.
Таким образом, параметр определенно объявлен в этой точке. Как насчет использования его в decltype
? Формулировка устарела и непреднамеренно запретила это. См. основной вопрос 2082:
Согласно 8.3.6 [dcl.fct.default], параграф 9,
Аргумент по умолчанию оценивается каждый раз, когда функция вызывается без аргумента для соответствующего параметра. Порядок оценки аргументов функции не указан. Следовательно, параметры функции не должны использоваться в аргументе по умолчанию, даже если они не оцениваются. Это запрещает использование параметров в невычисленных операндах, например,
void foo(int a = decltype(a){});
Эта формулировка предшествует понятию «неоцененные операнды» (фраза «не оцененные» относится к вызовам функции, в которой предоставляется фактический аргумент, и поэтому аргумент по умолчанию не используется, а не к невычисленным операндам) и не должна применяться к таким случаям. .
Таким образом, цитируемый абзац был изменен следующим образом:
Параметр не должен появляться как потенциально вычисляемое выражение в аргументе по умолчанию.
Поскольку операнды decltype
не оцениваются, теперь это нормально, а GCC неверен.
int h(int a, int b = sizeof(a));
используется в примере как ошибка, поэтому я бы сказал, что в конце концов это не разрешено. - person krzaq   schedule 09.11.2016decltype(value)
не является потенциально оцениваемым выражением. - person vladon   schedule 09.11.2016sizeof(a)
является незаконным. - person NathanOliver   schedule 09.11.2016