2015-10-21 3 views
3

Учитывая следующий код:Могу ли я безопасно указывать данные переназначенного boost :: optional?

boost::optional<int> opt; 
opt = 12; 
int* p(&*opt); 
opt = 24; 
assert(p == &*opt); 

Есть ли гарантия того, что утверждают всегда будет действовать?

+0

Что говорит документация? –

+0

Я не нашел ответа в документации, но, возможно, я пропустил его. – Julien

+0

Примечание: до тех пор, пока указатель используется, необязательный параметр не должен изменять его внутреннее состояние (необязательно = boost :: none будет фатальным). –

ответ

3

да это гарантия. T из boost::optional<T> является логически частным членом необязательного.

приведенный выше код логически эквивалентен:

bool opt_constructed = false; 
int opt_i; // not constructed 

new int (&opt_i)(12); opt_constructed = true; // in-place constructed 

int*p = &opt_i; 

opt_i = 24; 

assert(p == &opt_i); 

// destuctor 
if (opt_constructed) { 
    // call opt_i's destructor if it has one 
} 
+0

'* opt' возвращает ссылку на внутренний член или генерирует исключение, если оно не было создано. 'opt = 24' присваивает уже построенный член. –

+0

игнорировать меня. не думал. – NathanOliver

+0

Можете ли вы указать часть документации, которая вернет ваш ответ? – Julien

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