Гарантируется ли в C ++ определённое постоянство функции-члена? - PullRequest
3 голосов
/ 07 апреля 2011

Если у меня есть следующее:

class A {
    int foo() const {
       j++;
       return i;
    }

    int& foo() {
       return i;
    }

    int i;
    mutable int j;
};

тогда, очевидно, что-то вроде

A a;
a.foo() = 5;

вызывает неконстантную версию. Но какие условия должны быть выполнены, чтобы убедиться, что вызов для константной или неконстантной версии для нескольких примеров ...

int i = a.foo(); //I would expect to call the const. Is it guaranteed?

const int j = a.foo(); //Ditto

const int& l = a.foo(); //Ditto

int& k = a.foo(); //I would expect the non-const
foobar(k); //foobar is "void foobar(int)"
return; //but the compiler could potentially decide the const version is fine.

Ответы [ 4 ]

4 голосов
/ 07 апреля 2011

const функция вызывается, когда сам объект имеет значение const.

int i = static_cast<const A>(a).foo(); //calls const function

Также посмотрите этот код для лучшего понимания: ( должен прочитать комментарии )

void f(const A &a) //a is const inside the function
{
    int i = a.foo(); // calls const function
}
void h(A &a) //a is non-const inside the function
{
    int i = a.foo(); // calls non-const function
}

A a;
f(a);
h(a); //pass the same object!

См. Онлайн-демонстрацию: http://ideone.com/96flE

3 голосов
/ 07 апреля 2011

Возвращаемые значения никогда не учитываются при определении перегрузки.

Также, когда a объявлен как

A a;

тогда неконстантная версия имеет приоритет.

Если a объявлено как

const A a;

тогда можно вызвать только константную версию.

3 голосов
/ 07 апреля 2011

Константа a определяет, какая функция - то, что вы делаете с возвращаемым значением, не является частью разрешения перегрузки. Все ваши образцы будут называться неконстантной версией.

1 голос
/ 07 апреля 2011

Разрешается ли ваш вызов функции-члена константной функцией-членом или нет, зависит от константности указателя "this", то есть объекта на LHS оператора точки или стрелки, который неявно передается вызываемой функции-члену.

Разрешается до неконстантного:

A a;
a.foo();

Разрешается до константного:

void bar(const A& a)
{
   a.foo();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...