Я бы утвердил ошибку в g ++, потому что, цитируя draft N3242 , §12.2 / 5:
Второй контекст - это когда ссылка привязана к временный. Временное, к которому привязана ссылка, или временное, являющееся полным объектом подобъекта, к которому привязана ссылка, сохраняется для времени жизни ссылки, за исключением:
. Таким образом, его время жизни должно быть расширенный, за исключением случаев, когда:
Временная привязка к ссылочному элементу в ctor-initializer конструктора [..]
Временная привязка к эталонному параметру в вызове функции [..]
Время жизни временной привязки к возвращаемому значению в операторе return функции [..]
Временная привязка к ссылке в
new-initializer
[. .]Наш случай не соответствует ни одному из этих исключений, поэтому он должен следовать правилу. Я бы сказал, что g ++ здесь не так.
Затем, в отношении котировки aschepler, поднятой из того же проекта §8.5.3 / 5 (выделение мое):
A ссылка на тип « cv1
T1
» инициализируется выражением типа « cv2T2
» следующим образом:
- Если ссылка является ссылкой на lvalue и выражением инициализатора a. является lvalue (но не является битовым полем), а « cv1
T1
» является ссылочным-совместимым с « cv2T2
» или b. имеет тип класса ... тогда ...- В противном случае ссылка должна быть ссылкой lvalue на нелетучий тип const (то есть cv1 должна быть
const
), или ссылка должна быть ссылкой rvalue. а. Если выражение инициализатора i. является значением xvalue, классом prvalue, значением prvalue или значением функции lvalue и " cv1T1
" является ссылочным-совместимым с " cv2T2
" или ii. имеет тип класса ... тогда ссылка привязана к значению выражения инициализатора в первом случае .... b. В противном случае временный тип « cv1T1
» создается и инициализируется из выражения инициализатора, используя правила для неосновной копии-инициализации (8.5). Ссылка затем привязана к временному.Глядя на то, что такое xvalue, на этот раз ссылаясь на http://en.cppreference.com/w/cpp / language / value_category ...
Выражение xvalue ("expying value") [..]
a.m
, член объекта выражение, где a - значение r, а m - нестатический элемент данных не ссылочного типа;... выражение
center().x
должно быть значением x, поэтому случай 2a из Применяется §8.5.3 / 5 (а не копия). Я останусь с моим предложением: g ++ ошибается.
Вы, возможно, удалили папку устройств. Для решения этой проблемы делают следующее.
- Открывают Terminal и запись xcrun simctl erase all