C++ - почему статическая функция-член не может быть создана с помощью квалификатора " const
сегодня у меня проблемы. Я нуждаюсь в static
функции-члена, const
Не обязательно, но лучше. Но мои усилия не увенчались успехом. Кто-нибудь может сказать, почему или как?
4 ответов
при использовании const
квалификатор к нестатической функции-члену, он влияет на this
указатель. Для const-квалифицированной функции-члена класса C
на this
указатель типа C const*
, тогда как для функции-члена, которая не является const-квалифицированной,this
указатель типа C*
.
статическая функция-член не имеет this
указатель (такая функция не вызывается на конкретном экземпляре класса), поэтому const квалификация статического функция-член не имеет никакого смысла.
Я согласен с вашим вопросом, но, к сожалению, язык C++ разработан таким образом. Например:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
на сегодняшний день const
рассматривается в контексте this
. В каком-то смысле она узкая. Его можно расширить, применив это const
дальше this
указатель.
то есть" предлагаемое"const
, который также может применяться к static
функции, ограничат static
участники из любой модификации.
в примере кода if foo()
можно сделать const
, то в этой функции,A::s
невозможно изменить. Я не вижу никаких побочных эффектов языка, если это правило добавлено к стандарту. Наоборот, забавно, что такого правила не существует!
Не вдаваясь в подробности, это потому, что может быть или не быть объект, измененный функцией, поэтому const неоднозначен для компилятора.
Напомним, что const
сохраняет объекты постоянными, но здесь может быть или не быть объекта, чтобы сохранить константу.
к сожалению, C++ не принимает его в соответствии с дизайном, но логически есть несколько случаев использования, в которых он хорошо проверяет.
функция, которая является допустимым уровнем класса (статическая), может не изменять статические данные, может быть, это просто запрос данных должен быть const. Может быть, это должно быть как
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios