В моем приложении есть следующий код. Почему мы используем ключевое слово 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