Рассмотрим следующий код: https://gcc.godbolt.org/z/9qj15faezобразной#include
#include
#include
template
std::make_unsigned_t to_unsigned(T t)
{
return t;
}
template
concept CanMakeUnsigned = requires(const T &t){to_unsigned(t);};
static_assert(!CanMakeUnsigned);
< /code>
Это компилируется в GCC 11 и более нове и в Clang с Libc ++. Но это вызывает жесткую ошибку (в make_unsigned_t ) в MSVC, Clang с Libstdc ++ и GCC 10 и старше.
Какой компилятор правильный? Это правовой код или нет? https://gcc.godbolt.org/z/zz3kx1xxe
template concept C = sizeof(T) == 42;
template struct A
{
T *x;
};
template
A blah() {return {};}
template
concept CanBlah = requires{blah();};
static_assert(!CanBlah);
Подробнее здесь: https://stackoverflow.com/questions/794 ... -compilers