Обратите внимание на следующую программу на C ++ 20:
#include <iostream>
template<typename T>
struct A {
using X = typename T::X;
};
template<typename T>
constexpr bool WorksWithA = requires { typename A<T>; };
struct GoodArg {
using X = int;
};
struct BadArg {
};
int main() {
std::cout << WorksWithA<GoodArg> << std::endl;
std::cout << WorksWithA<BadArg> << std::endl;
}
Это плохо сформировано? А если нет, то каким должен быть результат?
Я ожидал, что результат будет 1 0
, но наблюдаю clang 1 1
. Кто прав и почему?
$ clang++ --version
clang version 10.0.0-4ubuntu1
$ clang++ test.cc -std=c++20
$ ./a.out
1
1
WorksWithA
всегда будет истинным, потому чтоA<T>
не ограничен. - person bolov   schedule 15.02.2021requires { typename T::X; }
то работает - person PiotrNycz   schedule 15.02.2021