次のコードを検討してください。
#include <type_traits>
#include <iostream>
template <class T> concept bool C1 = std::is_same<T, int>::value;
template <class T> concept bool C2 =
C1<decltype(std::declval<T>() + std::declval<T>())>;
struct A {};
int main() {
std::cout << C2<int>;
std::cout << C2<A>;
return 0;
}
GCC はそれを正常にコンパイルし、10 を出力します。
しかし、 N4553の§14.10.1.2述語制約[temp.constr.pred]は言う
述語制約は、定数式 E (5.19) を評価する制約です。
その後
置換後、E は bool 型になります。
C1<decltype(std::declval<A>() + std::declval<A>())>
bool型ではなく、置換の失敗なので、プログラムの形式が正しくないということですか?