§12.2 / 5 говорит & ldquo; Второй контекст [когда время жизни временного расширено] - это когда ссылка привязана к временному. & rdquo; Взято буквально, это ясно говорит о том, что срок жизни должен быть расширен в вашем случае; ваш B :: a
, безусловно, связан с временным. (Ссылка привязывается к объекту, и я не вижу другого объекта, к которому он мог бы привязываться). Однако это очень плохая формулировка; Я уверен, что подразумевается & ldquo; Второй контекст - это когда используется временное значение для инициализации ссылки, & rdquo; , а расширенное время жизни соответствует значению ссылки, инициализированной выражением rvalue временное, а не любое из других ссылок, которые впоследствии могут быть связаны с объектом. В соответствии с этим формулировка требует чего-то, что просто не реализуемо: рассмотрите:
void f (A const & amp; a) {static A const & amp; localA = a; }
с:
f (A ());
Где должен компилятор поставить A ()
(учитывая, что он вообще не может видеть код f ()
и doesn '
Я думаю, что это стоит DR.
Могу добавить, что есть текст, который настоятельно предлагает, чтобы мой интерпретация намерения верна. Представьте, что у вас был второй конструктор для B
:
B :: B (): a (A ()) {}
В этом случае B :: a
будет непосредственно инициализироваться временным; время жизни этого временного должно быть расширено даже по моей интерпретации. Тем не менее, стандарт делает конкретное исключение для этого случая; такое временное действие сохраняется только до тех пор, пока конструктор не выйдет (что снова оставит вас с обвисшей ссылкой). Это исключение дает очень сильное указание на то, что авторы стандарта не намеревались ссылаться на ссылки на члены в классе, чтобы продлить время жизни любых временных связей, к которым они привязаны; опять же, мотивация - это реализуемость. Представьте себе, что вместо
B b ((A ()));
вы написали:
B * b = new B (A ());
Где должен компилятор помещать временный A ()
так, чтобы это было время жизни для динамически выделенного B
?
Вы можете использовать следующее выражение с режимом без учета регистра:
\b((?:[a-z]+\S*\d+|\d\S*[a-z]+)[a-z\d_-]*)\b
Объяснение:
\b # Assert position at a word boundary
( # Beginning of capturing group 1
(?: # Beginning of the non-capturing group
[a-z]+\S*\d+ # Match letters followed by numbers
| # OR
\d+\S*[a-z]+ # Match numbers followed by letters
) # End of the group
[a-z\d_-]* # Match letter, digit, '_', or '-' 0 or more times
) # End of capturing group 1
\b # Assert position at a word boundary