В C++, где это доступно, это хорошая практика, чтобы использовать auto
для многих переменных, в частности, тип которого известен, но раздражает впечатать:C++ 11 внешняя переменная сфера объявлена авто
weird_template_type<int,char>::subtype::recursive_subtype some_function() {
// ...
}
// ...
auto val = some_function();
Это также хорошо использовать микрообъекты для объектов RAII, если это имеет смысл, например для блокировки:
some_setup_code();
int val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Есть ли способ смешать эти две идиомы, например. когда ваш код чтения общей памяти возвращает странный тип?
Очевидная версия не работает:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Это терпит неудачу во время компиляции из-за auto
переменного без инициализатора.
Аналогично, вы не можете объявить переменную внутри блока с областью действия, иначе она не будет доступна позже.
Единственные непосредственные параметры, которые я вижу, - это 1. введите явно объявление переменной (bleah) или 2. используйте auto
с некоторым другим выражением, которое, как известно, имеет тот же тип (не улучшение). Есть ли другой способ?
Может 'decltype()'? – HolyBlackCat
'auto val = (lock_guard (mut), read_shared_memory()); do_something (val); ' –
cpplearner
Я хочу отметить, что в большинстве случаев открытие новой области в середине« реальной »области для целей блокировки указывает на проблему с дизайном. вы должны подумать, почему это то, что вы делаете – ZivS