Почему C++ не позволяет ограничивать переопределения виртуальных функций с помощью предложения Concept/Requires?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему C++ не позволяет ограничивать переопределения виртуальных функций с помощью предложения Concept/Requires?

Сообщение Anonymous »

Я попытался написать следующий код, но он был отклонен компилятором:

Код: Выделить всё

#include 
struct Base {
virtual void f() {}
};

template 
struct Derived : Base {
virtual void f() requires std::is_same_v override {}
};
Соответствующий раздел стандарта я нашел здесь:

11.7.3 Виртуальные функции

6 Виртуальная функция не должна иметь завершающего предложения require ([dcl.decl]).

[Пример 5:

Код: Выделить всё

template
struct A {
virtual void f() requires true;       // error: virtual function cannot be constrained ([temp.constr.decl])
};
— конец примера]

но я не понимаю мотивации этого. Учитывая, что для производного класса совершенно разумно не переопределять виртуальную функцию базового класса, почему не считается правильным решить, существует ли это переопределение на основе ограничения (время компиляции)?
Это ограничение кажется особенно глупым (по крайней мере, в этом примере), поскольку этот код является законным и, по сути, достигает того же самого, но более подробно:

Код: Выделить всё

template 
struct Derived : Base {
};

template 
requires std::is_same_v
struct Derived : Base {
virtual void f() override {}
};
Изменить
Похоже, я вызвал некоторую путаницу из-за отсутствия спецификаторов virtual в функциях переопределения в Derived. Я добавил их, чтобы было ясно, что я собираюсь переопределить виртуальную функцию базового класса (с помощью другой виртуальной функции).

Подробнее здесь: https://stackoverflow.com/questions/798 ... -a-concept
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»