Я читал С++ Primer и не мог понять, когда выражение дает тип объекта, и когда он дает ссылочный тип объекту.
Я цитирую из книги:
- Когда мы применяем decltype к выражению, которое не является переменной, мы получаем тип, который дает это выражение.
- Вообще говоря, decltype возвращает ссылочный тип для выражений, которые дают объекты, которые могут стоять в левой части задания.
Учитывая следующий код:
int i = 3, *ptr = &i, &ref = i;
decltype(ref + 0) j;
В приведенном выше коде выражение "ref + 0" приводит к присущей операции добавления значения объекта, к которому ref ссылается, я и 0. Следовательно, при первом правиле выражение дает тип int. Но, переходя по второму правилу, поскольку выражение дает тип объекта, который может стоять в левой части присваивания (в этом случае int), не должен ли decltype присвоить номер int (int &)?
В книге также говорится, что для следующего кода
decltype(*ptr) k;
k имеет тип int & а не int, тип, к которому приводит выражение.
Он также говорит, что для выражения присваивания, как в коде ниже
decltype(a = b) l;
l будет иметь тип ссылки на объект в левой части операции присваивания.
Как мы узнаем, какие выражения дают тип объекта и которые дают ссылку на тип объекта?