У меня есть следующий код, использующий понятия:
struct bar {
void foo() {}
};
template <typename T>
concept Fooable = requires (const T& t) { // const bar& t doesn't support t.foo()
{ t.foo() };
};
template <typename Fooable>
void callfoo(Fooable bar)
{
bar.foo();
}
int main()
{
bar b;
callfoo(b);
return 0;
}
Я ожидаю, что код не будет компилироваться, поскольку bar
не поддерживает вызов foo()
для экземпляра const. Однако он прекрасно компилируется - ссылка .
Описание списка параметров в cppreference не очень помогает в этом отношении:
параметр-список - запятая -разделенный список параметров, как в объявлении функции, за исключением того, что аргументы по умолчанию не допускаются и не могут заканчиваться многоточием (кроме одного, означающего расширение пакета). Эти параметры не имеют хранения, связи или срока службы и используются только для определения требований. Эти параметры находятся в области действия до закрытия} секвенса-требования.
Не понимаю ли я, для чего нужны cv-квалификаторы в списке параметров выражения expression? Я что-то упустил полностью? Кроме того, меня смущает то, что в cppreference есть несколько примеров, использующих универсальные ссылочные параметры, поэтому в этом должен быть какой-то смысл.
Я использую gcc9
с -fconcepts
(хотя g cc trunk и clang with Концепции Godbolt также хороши с этим кодом, поэтому не думайте, что он связан с компилятором).