2016-02-17 4 views
1

я наткнулся на этот странный вопросC++ возвращает неконстантную метод в константный метод

У меня есть метод, который является константной, само по себе:

void doSomething() const { x(); } и х неконстантная метод.
Компиляция приведет к ошибке discards qualifiers.

сказать, я перехожу к doSomethingint и сделать x возвращение некоторых фиктивная INT, и он превращается в:

int doSomething() const { return x(); }

Это нормально, что он будет компилировать? он компилируется на моем компиляторе, что заставляет меня думать, что это может быть ошибкой компилятора.

версия компилятора: gcc (Debian 4.4.5-8) 4.4.5


class GgWp 
{ 
public: 
    int doSomething const { return x(); } 
    int x() 
    { 
     num = 5; 
     return 0; 
    } 
private: 
    int num; 
} 

Как вы можете видеть, x изменяет переменную num

+0

Нет, это должно дать ту же ошибку, но вряд ли это ошибка компилятора. Просьба привести полный пример проблемы. –

+1

отредактированный фрагмент кода выше не мог быть вашим фактическим кодом, так как 'doSomething' lacks'() ' – sp2danny

+1

Не имеет значения, действительно ли' x' что-то изменяет или нет, функция-член, помеченная как 'const', t вызвать функцию-член, не помеченную как 'const'. –

ответ

3

Рассмотрим следующую строку:

int doSomething() const { return x(); }

Если x() функция член, то она должна быть const или это не будет компилировать на каких-либо серьезных соответствующих стандартам компилятор. Это не имеет никакого отношения к тому, действительно ли вы возвращаете значение x() или возвращаете ли вы что-либо от doSomething(). Вы не можете запустить функцию non-const из функции const.

Если x() не является членом, тогда это не применяется.

+0

Yup. Так что это мой ответ. Код, который я предоставил, действительно не компилировался –

1

constпосле имя функции относится к объекту (this) , поэтому вы не сможете позвонить x() (если x не const) из метода const, и типы возврата не должны иметь никакого значения.

Если это скомпилировано, либо x() не является членом, это const, или ваш компилятор неисправен.

Смежные вопросы