Почему зависимое выражение не диагностируется как ошибка в ложном блоке if-constexpr, даже если это всегда семантическаяC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему зависимое выражение не диагностируется как ошибка в ложном блоке if-constexpr, даже если это всегда семантическая

Сообщение Anonymous »

Похоже, существует большая путаница в отношении if constexpr и разницы между зависимыми и независимыми выражениями, особенно в контексте static_assert. До CWG2518 static_assert( false ) требовал обходных решений, таких как перечисленные в коде ниже, чтобы сделать условие утверждения зависимым от параметров шаблона.
В общем, я рассматриваю выражение зависимо, если оно зависит от параметров шаблона, даже если окончательное значение выражения не зависит от параметров шаблона. Например, в static_assert( (sizeof(T), false), «Тип T недействителен» ) подвыражение sizeof(T) делает выражение с запятой зависимым даже несмотря на то, что это не влияет на значение выражения с запятой и не может иметь никаких побочных эффектов.
Однако в приведенном ниже примере кода оно компилируется нормально, даже несмотря на то, что код static_assert( make_dependent (ложь), «Недопустимое значение») может быть статически определено как несоответствие аргумента шаблона, поскольку параметр шаблона I всегда является нетиповым параметром шаблона и make_dependent принимает только аргументы шаблона type, и никакой набор аргументов шаблона не может исправить это несоответствие. Но если выбран блок this if constexpr, то вместо ошибки static_assert будет несоответствие аргументов шаблона.
Похоже, потому что зависимое имя I появляется где угодно в выражении, он откладывается до момента создания экземпляра шаблона и даже во время создания экземпляра шаблона, если if constexpr не выбирает этот блок, всегда несовпадающий Аргумент шаблона по-прежнему принимается, даже хотя никакой набор аргументов шаблона не может фальсифицировать это несоответствие.
Правда ли, что невыделенный блок if constexpr полностью игнорируется при экземплярировании шаблона время, и что только синтаксические ошибки и семантические ошибки в независимых выражениях диагностируются во время определения шаблона, даже если зависимые выражения может быть статически определено наличие диагностируемые семантические ошибки независимо от аргументов шаблона?


#include

// Make an expression dependent on arbitrary template type parameters
// Can be used to defer using a type which is incomplete until template instantiation time
// Can be used to defer static_assert( false, ... ) until template instantiation time
template
constexpr T&& make_dependent( T&& x ) {
return std::forward( x );
}

struct incomplete;

template
void defer_incomplete( incomplete& i ) {
// i.method(); Error: cannot call method on incomplete type
make_dependent( i ).method(); // Okay -- defer until template instantiation
}

template
auto func() {
if constexpr( I != 0 ) {
return I;
} else {
// Fails before C++23 because static_assert condition is non-dependent
// https://cplusplus.github.io/CWG/issues/2518.html
// static_assert( false, "Invalid value" );

// Uses always-false dependent static_assert condition
static_assert( I != 0, "Invalid value" );

// Cleverly uses comma operator to make static_assert condition dependent
static_assert( ( I, false ), "Invalid value" );

// Works even though the make_dependent template argument is always a non-type
// Fails with template argument mismatch only if if constexpr branch reaches here
static_assert( make_dependent( false ), "Invalid value" );
}
}

struct incomplete {
void method() {}
};

int main() {
incomplete i;
defer_incomplete( i );
func();
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... -constexpr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»