Как понять значение в списке инициализации ссылки - PullRequest
1 голос
/ 20 марта 2020

Рассмотрим следующий код:

#include <iostream>
struct A {
    A() = default;
    A(int) {

    }
};
int main() {
    A const& rf = { 0 };
}

Приведите цитату в стандарте здесь:

В противном случае, если T является ссылочным типом, prvalue (# 1) ) типа, на который ссылается T, генерируется. prvalue инициализирует свой объект результата с помощью copy-list-initialization или direct-list-initialization , в зависимости от вида инициализации для ссылки. prvalue затем используется для прямой инициализации ссылки. [Примечание: Как обычно, привязка завершится неудачно, и программа будет некорректной, если ссылочный тип является lvalue-ссылкой на неконстантный тип. - примечание конца]

Я не понимаю "prvalue" в #1, Как обозначить это prvalue? И далее, зачем использовать prvalue, чтобы снова инициализировать свой объект reuslt list-initialization, и почему бы не использовать объект reuslt для прямой инициализации ссылки вместо использования prvalue?

Чтобы конкретно описать prvalue, обозначает ли A{0} prvalue (в # 1)?

Итак, мои вопросы:

1.Как обозначить prvalue (в # 1) или что такое actullay, что prvalue равно

2. С типом prvalue типа Был сгенерирован T '(удалить ссылку), почему бы не использовать прямую инициализацию ссылки prvalue

3. Я очень смущен тем, что "prvalue инициализирует свой объект результата" с помощью list-initialization снова

1 Ответ

3 голосов
/ 20 марта 2020

что такое actullay prvalue

prvalue является своего рода выражением. В C ++ 17 и более поздних версиях это специфическое выражение, которое инициализирует объект. Таким образом, prvalue - это просто механизм инициализации объекта. Таким образом, единственными характеристиками prvalue являются тип prvalue (ie: тип объекта, который он будет инициализировать) и механизм, который он будет использовать для инициализации этого объекта.

Как prvalue использование используется определяет, какой объект инициализируется им.

Итак, что же это за значение в этом случае? Это инициализатор, который использует форму инициализации списка для некоторого объекта типа, на который ссылается T. Это все, что нужно знать о prvalue.

, почему бы не использовать prvalue с прямой инициализацией ссылки

prvalue делает"direct -инициализировать "ссылку. Выражение, которое вы цитировали, c говорит так: «Затем значение prvalue используется для прямой инициализации ссылки.»

Если вы спрашиваете, почему между списком фигурных скобок есть значение prvalue ( aka: {...}) и ссылка, потому что на каком-то уровне написанный код не имеет смысла.

Ссылка относится к объекту и, следовательно, должна быть инициализирована путем предоставления ему объекта. Braced-init-list не является объектом; на самом деле, это даже не выражение . Это грамматическая конструкция, используемая для инициализации объекта. Итак, вы попытались инициализировать ссылку на объект чем-то, что не является объектом. По общему мнению, это должно быть ошибкой компиляции.

Однако существует очевидная интерпретация того, что ваш код имел в виду . А именно, используйте braced-init-list для инициализации объекта, затем используйте объект для инициализации ссылки. Вот что делает C ++.

Я очень запутался в том, что "prvalue инициализирует свой объект результата" путем повторной инициализации списка

Как уже говорилось, prvalue состоит из двух вещи: тип объекта, который будет инициализирован prvalue, и механизм, который будет использоваться для его инициализации. Это предложение объясняет последнюю часть.

...