LINUX.ORG.RU

Объясните пожалуйста простую вещь в плюсах

 


0

1

Есть допустим класс

class A{
private:
 B b;
public
...
 B& get_b() const{
  return b;
 }
}
Вообще корректно возвращать ссылку на свойство в const методе?

И что будет если сделать вот так? И почему?

void some_function(const A &a){
 B & tmp_b=a.get_b();
 tmp_b=<some_data>;
}
А что будет если сделать без const?
void some_function(A &a){
 B & tmp_b=a.get_b();
 tmp_b=<some_data>;
}

★★★

Скомпилировать не судьба?

anonymous
()

Некорректно. Хочешь иметь конст метод - возвращай константную ссылку (ссылку, по которой b нельзя поменять).

hlebushek ★★
()

Вообще корректно возвращать ссылку на свойство в const методе?

Только константную, иначе ошибка.

И что будет если сделать вот так? И почему?

Так как get_b может вернуть только константную ссылку, то ошибка. Если убрать константность метода, то снова ошибка, так как у тебя const A &a, а ты пытаешься вызвать неконстантный метод.

А что будет если сделать без const?

В первом случае то же самое, во втором всё ок.

mix_mix ★★★★★
()
Ответ на: комментарий от LIKAN

Да.

protip: отдаешь свой первый сниппет кода компилятору, и видишь, что он не компилируется:

class B {};

class A {
private:
    B b;
public:
    B& get_b() const {
        return b;
    }
};
> clang++ -std=c++14  -Wall -Wextra -pedantic cpp_const_test.cpp 
cpp_const_test.cpp:8:16: error: binding of reference to type 'B' to a value of
      type 'const B' drops qualifiers
        return b;
               ^
1 error generated.

А потом добавляешь слово const в сигнатуру возвращаемого значения метода, и видишь, что всё работает.

hlebushek ★★
()
Ответ на: комментарий от mix_mix

На ум пришло - в кастомном итераторе меняешь указатель на данные, например.

kachsheev ★★★
()
Ответ на: комментарий от Begemoth

А я только собрался тебя кастануть :)

Stil ★★★★★
()

https://channel9.msdn.com/posts/C-and-Beyond-2012-Herb-Sutter-You-dont-know-blank-and-blank

я оставлю это здесь для икспердов чуть выше по треду

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.