Спецификаторы cv в концепции требуют списка параметров выражения - PullRequest
1 голос
/ 23 февраля 2020

У меня есть следующий код, использующий понятия:

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 также хороши с этим кодом, поэтому не думайте, что он связан с компилятором).

1 Ответ

6 голосов
/ 24 февраля 2020

В вашей функции callfoo есть ошибка. Вы используете типовое имя, а не концепцию. Измените объявление на

template <Fooable Foo>
void callfoo(Foo bar)

или

void callfoo(Fooable auto bar)
...