Похоже, существует большая путаница в отношении 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
Почему зависимое выражение не диагностируется как ошибка в ложном блоке if-constexpr, даже если это всегда семантическая ⇐ C++
Программы на C++. Форум разработчиков
1734933449
Anonymous
Похоже, существует большая путаница в отношении if constexpr и разницы между зависимыми и независимыми выражениями, особенно в контексте static_assert. До CWG2518 static_assert( false ) требовал обходных решений, таких как перечисленные в коде ниже, чтобы сделать условие утверждения зависимым от параметров шаблона.
В общем, я рассматриваю выражение зависимо, если оно зависит от параметров шаблона, даже если окончательное значение выражения не зависит от параметров шаблона. Например, в static_assert( (sizeof(T), false), «Тип T недействителен» ) подвыражение sizeof(T) делает выражение с запятой зависимым даже несмотря на то, что это не влияет на значение выражения с запятой и не может иметь никаких побочных эффектов.
Однако в приведенном ниже примере кода оно компилируется нормально, даже несмотря на то, что код static_assert( make_dependent (ложь), «Недопустимое значение») может быть статически определено как несоответствие аргумента шаблона, поскольку параметр шаблона I всегда является [b]нетиповым[/b] параметром шаблона и make_dependent принимает только аргументы шаблона [b]type[/b], и никакой набор аргументов шаблона не может исправить это несоответствие. Но если выбран блок 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();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79302269/why-is-a-dependent-expression-not-diagnosed-as-an-error-in-a-false-if-constexpr[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия