Должно быть rvalue, но веб-компилятор работает под управлением Visual Studio, а Visual Studio имеет расширение, позволяющее привязывать временные объекты к неконстантным ссылкам lvalue. ошибка/расширение, из-за которой в данном случае генерируется lvalue. Как указывает Игорь выше, это можно отключить с помощью /Za
(посмотреть вживую).
Мы видим, что это должно быть rvalue(в частности, prvalue) из черновика стандартного раздела C++ 5.4
параграф Явное преобразование типов (нотация приведения) 1, в котором говорится (выделено мной):
Результат выражения (T) cast-expression имеет тип T. Результатом является lvalue, если T является ссылочным типом lvalue, или ссылка rvalue на тип функции, и xvalue, если T является ссылкой rvalue на тип объекта; в противном случае результатом будет значение prvalue.[ Примечание: если T является типом, не относящимся к классу, но с уточнением cv, квалификаторы cv игнорируются при определении типа результирующего значения prvalue; см. 3.10. -конец примечания]
Как gcc, так и clang приводит к rvalue, что является ожидаемым результатом.
Кроме того, я бы рекомендовал использовать rextester поверх веб-компилятора, поскольку rextester позволяет вам программа, а также имеет живой обмен.
Обновить
Бен Фойгт указывает на этот отчет об ошибке, поэтому кажется, что Visual Studio действительно создает lvalue. Так что это не просто случай расширения , которое позволяет привязывать временные объекты к неконстантным ссылкам lvalue.
Как указывает dyp, gcc также имел приведение к расширению lvalue.
Обновление 2
Компания Mgetz отправила отчет об ошибке. В ответ было сказано, что это исправлено с помощью /Zc:rvalueCast флаг, описание флага выглядит следующим образом :
Если указан параметр /Zc:rvalueCast, компилятор правильно определяет ссылочный тип rvalue как результат операции приведения в соответствии со стандартом C++11. Если параметр не указан, поведение компилятора такое же, как в Visual Studio 2012. По умолчанию параметр /Zc:rvalueCast отключен. Для соответствия и устранения ошибок при использовании приведения рекомендуется использовать /Zc:rvalueCast.
Неясно, будет ли этот флаг включен по умолчанию в будущих версиях.
person
Shafik Yaghmour
schedule
22.10.2014
/Za
. - person Igor Tandetnik   schedule 22.10.2014