можно определить и скопировать инициализировать переменную внутри условия в if
заявление:Direct инициализацией объекта внутри условия
if(int i = 17) { ... }
Это также работает с пользовательскими типами, при условии, что они перегружают operator bool
:
if(Foo f = 42) { ... }
if(Foo f = Foo(43)) { ... }
Почему я не могу использовать прямую инициализацию, как следующий?
if(Foo f(51)) { ... }
GCC испускает error: expected primary-expression before 'f'
.
Есть ли причина, кроме «потому что грамматика говорит так»? И как я могу обойти это?
Я работаю с VC++ 03, где Foo
:
- является RAII-чувствительный объект, для которого я позаботилась не определить конструктор копирования
- шаблон взятие аргументы от пользователя
- имеет конструктор двух параметров
... так что я предпочел бы не копировать его или повторять его тип.
Примечание: хотя моя фактическая проблема связана с C++ 03, я (академически) интересуюсь ответами на C++ 11.
Связано с [Может ли переменная быть определена только в области if-утверждения, аналогично тому, как это часто делается для for-loops?] (Http://stackoverflow.com/q/24017216/1708801) –
Почему вы думаете, что декларация 'Foo f = 42' подразумевает копирование/перемещение? Не следует копировать работу по элиции? – Columbo
@Columbo AFAIK copy elision - это оптимизация, которая выполняется или не может выполняться, но даже если это не тот объект, который нуждается в конструкторе копии, который я отключил, чтобы избежать «auto_ptr»-подобного зла. В конце концов я работал над проблемой, передав 'std :: pair'. – Quentin