Got it, thanks! On Tue, Feb 28, 2023 at 4:26 PM Jonathan Wakely <jwakely.gcc@xxxxxxxxx> wrote: > On Tue, 28 Feb 2023 at 21:22, Watson Romero via Gcc-help > <gcc-help@xxxxxxxxxxx> wrote: > > > > I was trying to learn how concepts work and for some reason the following > > lines of code: > > > > #include <cstddef> > > #include <cstdio> > > #include <type_traits> > > > > template <typename T> > > concept Averageable = std::is_default_constructible<T>::value && > > std::is_copy_constructible<T>::value && > > requires(T a, T b) { > > { a + b }->T; > > { a / b }->T; > > }; > > } > > > > template <Averageable T> > > T mean(const T* values, size_t length) { > > T result{}; > > for(size_t i{}; i < length; i++) { > > result += values[i]; > > } > > return result / length; > > } > > > > int main() { > > const double nums_d[]{ 1.0f, 2.0f, 3.0f, 4.0f }; > > const auto result1 = mean(nums_d, 4); > > printf("double: %f\n", result1); > > > > const float nums_f[]{ 1.0, 2.0, 3.0, 4.0 }; > > const auto result2 = mean(nums_f, 4); > > printf("float: %f\n", result2); > > > > const char nums_c[]{ 1, 2, 3, 4 }; > > const auto result3 = mean(nums_c, 4); > > printf("char: %d\n", result3); > > } > > > > produces the following error while running g++ like so: > > g++ listing_6_21.cpp -std=c++20 -o a.out > > > > > > listing_6_21.cpp:9:20: error: return-type-requirement is not a > > type-constraint > > 9 | { a + b }->T; > > | ^ > > listing_6_21.cpp:10:20: error: return-type-requirement is not a > > type-constraint > > 10 | { a / b }->T; > > | ^ > > listing_6_21.cpp:12:1: error: expected declaration before ‘}’ token > > 12 | } > > > > I'm not sure if this is consistent with what should happen but I figured > > I'd inform you guys about it. > > This is the expected, correct behaviour for a C++20 compiler. > > The Concepts TS used the syntax in your code, but in C++20 you must > use a type-constraint, like so: > > { a + b } -> std::is_same_v<T>; >