#include
int main() {
struct S;
return std::destructible;
}
Какой результат должен быть создан здесь программой?
На практике я вижу, что EDG возвращает 1 здесь. GCC и MSVC возвращают 0 . И Clang с Libc ++ Сбой Компиляции:
/opt/compiler-explorer/clang-20.1.0/bin/../include/c++/v1/__type_traits/is_nothrow_destructible.h:28:31: error: incomplete type 'S' used in type trait expression
28 | : integral_constant {};
| ^
Если у меня есть неполный тип, и оцениваю некоторую концепцию для него, например, некоторую концепцию из стандартной библиотеки: < /p> [code]#include
int main() { struct S; return std::destructible; } [/code] Какой результат должен быть создан здесь программой? На практике я вижу, что EDG возвращает 1 здесь. GCC и MSVC возвращают 0 . И Clang с Libc ++ Сбой Компиляции: [code]/opt/compiler-explorer/clang-20.1.0/bin/../include/c++/v1/__type_traits/is_nothrow_destructible.h:28:31: error: incomplete type 'S' used in type trait expression 28 | : integral_constant {}; | ^ [/code] онлайн демо: https://gcc.godbolt.org/z/9as4jkm1qобразно>
Похоже, что все компиляторы выполняют кэширование оценок концепций. Поэтому, если какая-то концепция была оценена как false , как только она не будет переоценена снова для того же аргумента:
template
concept C = T::a;
Похоже, что все компиляторы выполняют кэширование оценок концепций. Поэтому, если какая-то концепция была оценена как false , как только она не будет переоценена снова для того же аргумента:
template
concept C = T::a;
Похоже, что все компиляторы выполняют кэширование оценок концепций. Поэтому, если какая-то концепция была оценена как false , как только она не будет переоценена снова для того же аргумента:
template
concept C = T::a;