Различия в порядке проверки ограничений между компиляторами?C++

Программы на C++. Форум разработчиков
Anonymous
Различия в порядке проверки ограничений между компиляторами?

Сообщение Anonymous »

Рассмотрим следующий код: 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

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