в следующем коде, если мы выбираем «Option A» и исключение выдается operator new()
, существует ли any вероятность того, что переменная-член ptr
не будет равна nullptr
когда деструктор будет вызываться при разматывании стека?
Я на мгновение забуду, что ptr
фактически никогда не инициализируется в MemoryHolder
до вызова new
и, следовательно, может иметь неопределенное значение. Таким образом, ваш вопрос «будет ли ptr
иметь то же значение до назначения, что и после?»
В той степени, в которой вы действительно можете это проверить (что в конструкторе означает, что вам фактически нужно перехватить исключение внутри конструктора), да, оно будет иметь то же значение.
Я не нашел определения «вычисления значений» в стандарте.
Хотя стандарт иногда углубляется в странный язык, он не пытается активно обмануть вас . Если термин не определен, то его следует принимать по номиналу. «Вычисление значения» означает ... вычисление значения. Вы назначаете A для B. Это означает, что нужно выяснить, что такое A и B. Что включает в себя вычисление значений для них, а затем выполнение присваивания.
Связанный (но неясный для меня): назначение в C ++ происходит несмотря на исключение на правой стороне
Это не имеет отношения к вашему вопросу, потому что речь идет о порядке «вычисления значения» для обеих сторон назначения, а не о выполнении назначения. ОП этого вопроса ошиблась. Назначение никогда не происходит на самом деле. Просто map::operator[]
создаст запись на карте, если она еще не существует. А поскольку в C ++ 14 нет последовательности двух сторон операции присваивания, реализации могут позволять им происходить в любом порядке. И в этом случае operator[]
произошло первым, поэтому элемент был вставлен, хотя назначения не было.