2014-08-28 2 views
4

У меня есть этот код:Как найти функции C++, которые должны быть const?

#include <stdio.h> 

class A 
{ 
public: 
    int doit() 
    { 
    return 5; 
    } 
    int doit2() const 
    { 
    i++; 
    return i; 
    } 
    int i; 
}; 

int main() 
{ 
    A a; 
    printf("%d\n", a.doit()); 
    return 0; 
} 

Что компилируется с г ++ -Wall -Wpedantic main.cpp. Есть ли способ заставить g ++ сказать: «A :: doit() должен быть помечен как const»? g ++ 4.8 имеет -Wsuggest-attribute = const, но в этом случае он не работает. g ++ -Wall -Wpedantic -Wsuggest-attribute = const const_main.cpp -fipa-pure-const -O2 -Wextra по-прежнему чист.

Я согласен с тем, что const является конструктивным решением, но то, с чем я имею дело, является примером многих строк устаревшего кода, а для новых разработчиков, входящих в него, было бы полезно, если бы функции const были помечены как таковые. Я думаю, что компилятор знает достаточно, потому что, если я помечаю функцию как const, а затем модифицирую состояние, она выкинет ошибку. Я просто прошу об обратном, чтобы я мог прорваться и отметить функции const как const, и мне даже не нужно, чтобы он был совершенным и выяснял действительно сложные случаи, я бы согласился на простые случаи, поскольку у меня есть изложенных в приведенном выше коде.

Теперь я добавил неконстантную функцию doit2(), но заявил, что константа, а компилятор говорит:

const_main.cpp: In member function ‘int A::doit2() const’: 
const_main.cpp:12:6: error: increment of member ‘A::i’ in read-only object 
    i++; 
    ^

мне просто нужно противоположное тому, что (скажи мне, когда это может быть константной, но это ISN» t отмечен как таковой).

Найдено ответ здесь: Const correctness warnings c++

+0

do 'A const a; a.doit(); ' –

+0

@MattMcNabb Тогда должен быть предоставленный пользователем конструктор по умолчанию. – 0x499602D2

+0

добавьте 'const' после метода и создайте экземпляр также с ключевым словом 'const', чтобы использовать метод, объявленный с помощью 'const'. – jondinham

ответ

5

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

Очень простой пример является функцией с первоначальной реализации ала throw Not_Implemented(); - throw не предполагает необходимости быть не- const, но если логической операции запрашивает функции в конечном итоге реализованы и должны были бы изменить наблюдаемое состояние объекта, то его не следует называть первоначально const. std::string::shrink_to_fit() - аналогичный пример - он может быть пустым и, следовательно, потенциально const, когда он не реализован (стандарт говорит, что он является необязательным запросом), но должен быть не const, потому что при его реализации он изменяет наблюдаемое состояние объекта (например, будущая итераторская аннулирование во время действий, которые могут теперь инициировать более ранние resize()).

+0

Я не покупаю ваши рассуждения. Вы можете * ожидать * что-то, чтобы быть правдой, даже если это может быть неверно в меньшем числе случаев. Я думаю, можно с уверенностью сказать, что если не виртуальная функция не изменяет какое-либо состояние, существует вероятность 90% быть const. – Mehrdad

+0

@Mehrdad: я хочу сказать, что будет значительное количество ложных срабатываний ... в большом проекте, как регулярно использующийся предупреждающий флаг, который будет на нервы многих людей, но конечно - очевидно, что потенциальный интерес/полезность для случайные проверки этого типа - вероятно, подходят для инструмента типа 'cppcheck' больше, чем' gcc'. –

+0

Разве это не так много предупреждений? В крупных проектах они обязаны давать ложные срабатывания, но люди все равно находят их полезными независимо. – Mehrdad

1

Как найти функции C++, которые должны быть const?

Это просто об обнаружении, если вы изменяете любое состояние членов в this (class) рамки или нет. Также для ссылок на функции const ссылки на ссылки или указатели, которые позволяют изменять состояние переменных-членов класса, недействительны.не

И: Нет, нет никакого способа, это делается автоматически, вы должны отметить те функции, const вручную, и пусть компилятор сообщит вам, если код тела нарушает это ограничение.

+1

+1 Потому что это правильный ответ и очень прост и понятен. 'TLDR':« Если ваша функция изменяет что-либо (переменные/члены) внутри вашего класса, не отмечайте ее const .. иначе отметьте ее const ». – Brandon

0

Теперь я добавил неконстантную функцию doit2(), но заявил, что константа, а компилятор говорит: приращение элемента «A :: я» только для чтения объекта

Это потому, что вы 'пытаюсь изменить переменную-член внутри функции const. Функция const - это функция чистого наблюдателя, которая не изменяет состояние объекта и, следовательно, при попытке изменить состояние в такой функции компилятор жалуется.

Внутри функции const все переменные-члены, независимо от того, объявлены ли они const или нет, будут иметь квалификатор const. Исключением из этого правила являются те, которые были объявлены mutable.

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