Узнав о категориях значений, я обнаружил, что следующий фрагмент скомпилирован и работает очень хорошо:
#include <iostream>
int main() {
int x = 1;
int y = 2;
(true ? x : y) = 4;
std::cout << x << std::endl;
}
Вот вывод:
4
Сначала я проверил, было ли это утверждение допустимым в C ++, и я считаю, что это из-за следующего:
N4296 5.16.4 Условный оператор [expr.cond]
Если второй и третий операнды являются значениями одного и того же значения
категории и имеют одинаковый тип, результат этого типа и значения
категория, и это битовое поле, если второй или третий операнд является
битовое поле, или если оба поля битовые.
Учитывая, что оба x
а также y
являются lvalue (и, следовательно, glvalues), результатом условного выражения в обоих случаях является lvalue. Исходя из этого, выражение кажется верным. Однако не ясно, должно ли это иметь какой-либо эффект.
Причина, по которой я не уверен, должны ли условные операторы иметь эффект, заключается в том, что тип второго и третьего типов операндов int
, Даже если этот результат int
это lvalue, это не значит, что это должно относиться к x
или же y
, По сути, это может быть фиктивная переменная, которая не даст никакого эффекта, и будет соответствовать стандарту. Другими словами, я не вижу оснований для этого int&
а не отдельный int
,
Мой вопрос …
Это поведение правильно и почему?
Я посмотрел на этот вопрос заранее, но не верьте, что это отвечает на мой вопрос. Ответы на этот вопрос относятся к более старому стандарту с другой формулировкой и не отвечают на мой вопрос о том, является ли результат int&
в x
или нет.
Задача ещё не решена.
Других решений пока нет …