В моем приложении есть следующий код. Почему мы используем ключевое слово const
с типом возвращаемого значения и после имени метода?
const T& data() const { return data_; }
В моем приложении есть следующий код. Почему мы используем ключевое слово const
с типом возвращаемого значения и после имени метода?
const T& data() const { return data_; }
const T& data() const { return data_; }
^^^^^
означает, что он вернет ссылку const
на T
(здесь data_
)
Class c;
T& t = c.data() // Not allowed.
const T& tc = c.data() // OK.
const T& data() const { return data_; }
^^^^^
означает, что функция не будет изменять какие-либо переменные-члены класса (если только элемент не является mutable
).
void Class::data() const {
this->data_ = ...; // is not allowed here since data() is const (unless 'data_' is mutable)
this->anything = ... // Not allowed unless the thing is 'mutable'
}
Отборочный const
(и volatile
) привязывается к левой. Это означает, что в любое время, когда вы видите const
, оно применяется к токену слева от него. Однако есть одно исключение; если ничего не осталось слева от const
, вместо этого оно связывается справа. Важно запомнить эти правила.
В вашем примере первый const
не имеет ничего слева от него, поэтому он привязывается к правилу, который равен T
. Это означает, что возвращаемый тип является ссылкой на const T
.
Вторая константа имеет что-то слева от нее; функция data()
. Это означает, что const
связывается с функцией, делая ее функцией const
.
В конце мы имеем функцию const, возвращающую ссылку на const T.
Первая const
означает, что функция возвращает ссылку const T
.
Второй говорит, что метод не меняет состояние объекта. То есть метод не изменяет никаких переменных-членов.
const T& data() const { return data_; }
const после того, как функция-член указывает, что данные являются константной функцией-членом, и в этой функции-члене данные не изменяются.
const возвращает тип, возвращающий константу ref в T