константные указатели против константных ссылок в C ++ - PullRequest
11 голосов
/ 05 декабря 2011

Согласно следующей программе, я могу понять, что ключевое слово const в начале ссылки означает Const Reference to const value, верно?

#include <iostream>
using namespace std;

struct s
{
    int x;
};

int main(void)
{
    s a = {10}, b = {30};

    // IN POINTERS ----------------
    const s* ptrToConstValue;
    ptrToConstValue= &a;
    //ptrToConstValue->x = 30; 
    ptrToConstValue = &b;

    s* const constPtrToNonConstVaue = &a;
    constPtrToNonConstVaue->x = 40;
    //constPtrToNonConstVaue = &b;

    const s* const constPtrToConstValue = &a;
    //constPtrToConstValue = &b;
    //constPtrToConstValue->x = 30;


    // IN REFERENCES -------------
    const s& seemsToBeConstRefToConstValue = a;
    //s = b;
    //s.x = 30;

    return 0;
}

Ответы [ 6 ]

14 голосов
/ 05 декабря 2011

Таким образом, путаница заключается в следующем:

X x;

X* px       = &x; // pointer to x
X* const px  = &x; // *const pointer* to x

const X* px   = &x; // pointer to *const x*
X const* px   = &x; // identical

const X* const px = &x; // *const pointer* to *const x*

Теперь для справки «указательная часть» всегда постоянна:

X& rx = x;       // ref to x

X const& rx = x; // ref to const x
const X& rx = x; // identical
11 голосов
/ 05 декабря 2011

Ссылки всегда постоянны, поэтому вам не нужно ключевое слово const для их; на самом деле это запрещено.

Итак, у вас есть:

S*                ps;   //  Non-const pointer to a non-const value
S const*          psc;  //  Non-const pointer to a const value
S* const          pcs;  //  Const pointer to a non-const value
S const* const    pcsc; //  Const pointer to a const value

, но только:

S&                rs;   //  (const) reference to a non-const value
S const&          rsc;  //  (const) reference to a const value

const, который следует сразу за именем типа, может быть перемещен в начале декларации, за счет некоторой путаницы читатель.

7 голосов
/ 05 декабря 2011

Ссылки не могут быть изменены после их инициализации.Так что не имеет смысла говорить о «константной ссылке».Ссылка в значительной степени является значением, и в подобных случаях значение является постоянным и не может быть изменено.

6 голосов
/ 05 декабря 2011

Да, const перед ссылкой означает, что объект, на который она ссылается, обрабатывается как const (то есть вы не можете получить доступ к неконстантным методам или элементам данных).

Сама ссылка в любом случае всегда "const" в том смысле, что вы не можете изменить ее для ссылки на другой объект после инициализации.

4 голосов
/ 05 декабря 2011

Ссылка не является ни постоянной, ни неконстантной, это просто ссылка.Вы не можете сменить рефери ссылки (это его причина), поэтому говорить о константности не имеет смысла.В вашем примере ссылка просто называется ссылкой const, поскольку она ссылается на тип const.

3 голосов
/ 05 декабря 2011

Ключевое слово const в начале ссылки означает Const Ссылка на значение const, верно?

Это означает, что вы не можете изменить объект , используя ссылку.

Объект, на который ссылается ссылка, все еще может быть изменяемым, но его нельзя изменить , используя ссылку:

  • Если объект, на который он ссылается, действительно изменяем, тогда вы можете отбросить константу, используя const_cast, а затем изменить объект.

  • Но если объект нельзя изменить, то попытка изменить его, отбрасывая постоянство, вызовет неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...