Честно говоря, я считаю, это меньше запутанным, если переменная либо const
или нет, чем если это может измениться.
Выработать немного об этом: Причина вы обычно хотите сделать это, потому что вы не можете инициализировать const
переменную так, как вы хотите. std::vector
- хороший пример этого. Ну, на этот раз, на следующий стандарт вводит универсальный инициализации синтаксис, который делает это возможным:
const std::vector<int> cvi = { 1, 2, 3, 4, 5, 42 };
Однако, даже без вещей C++ 1x»под рукой, и даже с типами, блокирующей этот синтаксис инициализации, вы можете всегда создают вспомогательную функцию, чтобы делать то, что вы хотите:
const std::vector<int>& cvi = create_my_vector();
или, если вы хотите быть фантазии:
const std::vector<int>& cvi = compile_time_list<1,2,3,4,5,42>::create_vector();
Обратите внимание на &
. Нет смысла копировать результат вызова функции, поскольку привязка rvalue к ссылке const
продлевает срок ее службы до конца срока службы ссылки.
Конечно, перекомпиляция с помощью компилятора, который поддерживает семантику перемещения C++ 1x, сделает такие оптимизации практически ненужными. Но привязка rvlaue к ссылке const
может все же быть быстрее, чем перемещение вектора и вряд ли будет медленнее.
С C++ 1x вы также можете создавать лямбда-функции, выполняя эту операцию. C++ просто предоставляет невероятно огромный арсенал инструментов. IME, как бы вы ни думали, кто-то еще должен придумать еще одну идею сделать то же самое. И часто лучше, чем ваш.
Однако, проблема в этой проблеме обычно возникает только при слишком большом количестве кода в слишком малых функциях. И тогда это относится не только к константе, но и к сходным чертам - как к тому, на что ссылается ссылка.
Классика - это использование одного из нескольких возможных потоков.Вместо этого
int main(int argc, char* argv[])
{
std::istream* istrm = NULL;
std::ifstream ifs;
if(argc > 1)
{
ifs.open(argv[1]);
if(ifs.good())
istrm = &ifs;
}
if(!istrm)
istrm = &std::cin;
while(istrm->good())
{
// reading from *istrm implemented here
}
return 0;
}
просто разделить озабоченность в 1) выяснить, где читать и 2) фактическое чтение:
int read(std::istream& is)
{
while(is.good())
{
// reading from is implemented here
}
return 0;
}
int main(int argc, char* argv[])
{
if(argc > 1)
{
std::ifstream ifs(argv[1]);
if(ifs.good())
return read(ifs);
}
return read(std::cin);
}
Я до сих пор, чтобы увидеть реальный пример переменной это не было настолько постоянным, как могло бы быть, что не могло быть устранено путем разделения проблем. не
Что произойдет, если вы сконфигурируете v только в одной ветке if-then-else? –
Тогда он, вероятно, должен быть 'const' только в этой области. – Frank
Нет. Это не имело бы смысла. –