2014-11-12 6 views
1

Предположим, что у меня есть что-то вроде этого:Использование авто для глобальных констант

namespace { 
    const unsigned MY_UINT = 100u; 
    const float MY_FLOAT = 0.f; 
    const char* MY_STRING = "Hello World"; 
} 

ли я получить ожидаемое поведение с помощью auto для них? Я предполагаю, что это улучшение, но я не уверен в этом на практике.

namespace { 
    auto MY_UINT = 100u; 
    auto MY_FLOAT = 0.f; 
    auto MY_STRING = "Hello World"; 
} 

Являются ли два примера кода семантически одинаковыми? Будут ли они const автоматически? Если нет, следует указать auto const?

+0

Вы можете использовать 'auto' для объявления элементов данных класса' static'. – Casey

+1

'auto' предназначен для ввода текста без видимости - вам все равно нужно указать вашу область использования с ней, например. 'const auto',' extern auto', 'static auto' – ha9u63ar

+1

' const char * MY_STRING = "Hello World"; 'должно быть, должно быть' const char * const MY_STRING = "Hello World"; ' –

ответ

3

Правила дедукции auto эквивалентны вычету аргумента шаблона по значению. Создание объекта по значению влечет за собой удаление ссылок и высших квалификаторов cv-initialifier из инициализатора. Ваши два примера не эквивалентны. В частности, примитив 100u имеет тип unsigned int, поэтому это и выводится как. Аналогично, 0.f имеет тип float.

Добавление const имеет смысл только в том случае, если переменная сама не будет изменена. Если вы хотите сделать константы в своей программе, использование constexpr может быть лучше.

1

Да, вы должны указать его вручную. const.

Нет, это не очень хорошая практика. Обычно вам не следует злоупотреблять auto. Это ключевое слово может быть полезно, если имя типа очень длинное, но typedef часто является лучшим решением. Auto скрывает код. Более того, это облегчает ошибки. Иногда тип, который выводит компилятор, может отличаться от того, что вы имеете в виду. Вы можете использовать auto, если хотите, но лучше не делайте это без причины.

+1

Спасибо за ваши общие советы по 'auto', но [мне нравится мнение Херба Саттера лучше] (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/). –

+0

Поймать другую ссылку. http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#auto Это основа моего мнения. –

1

Нет, они не то же самое.

При вводе:

auto var = 123u; 

Это то же самое, как:

unsigned var = 123u; 

для того чтобы достигнуть

const unsigned var = 123u; 

Вы должны написать

const auto var = 123u; 

Не ждите от авто слишком много. Какие-то магические догадки.

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