Cv-квалификации prvalues ​​(пересмотренный) - PullRequest
0 голосов
/ 26 января 2019

Это продолжение моего предыдущего вопроса , в котором очевидный консенсус заключался в том, что изменение в трактовке cv-квалификаций prvalues ​​было довольно незначительным и несущественным изменением, предназначенным для устранения некоторых несоответствий (например, функций возвращая значения и объявляемые с типами возвращаемых cv).

Тем не менее, я вижу другое место в стандарте, которое, похоже, полагается на prvalues, имеющие cv-квалифицированные типы: инициализация const ссылок с prvalues ​​через временное преобразование материализации . Соответствующая формулировка может быть найдена в нескольких местах в 9.3.3 / 5

[...] Если преобразованный инициализатор является prvalue, его тип T4 настраивается на тип «cv1 T4» ([conv.qual]) и применяется временное преобразование материализации ([conv.rval]) [. ..]

[...] В противном случае выражение инициализатора неявно преобразуется в значение типа «cv1 T1». Применяется временное преобразование материализации, и ссылка привязывается к результату.

Намерение, очевидно, состоит в том, чтобы убедиться, что когда мы доберемся до фактического временного преобразования материализации

7.3.4 Преобразование временной материализации
1 Преобразование типа T может быть преобразовано в значение x типа T. Это преобразование инициализирует временный объект ([class.teilitary]) типа T из значения prvalue, оценивая значение prvalue с временным объектом как его объект результата, и производит xvalue, обозначающий временный объект. [...]

тип T, который он получает в качестве входных данных, включает необходимые cv-квалификации.

Но как эта cv-квалификация выдерживает 7.2.2 / 2 в случае неклассового значения, не являющегося массивом?

7.2.2 Тип
2 Если значение prvalue изначально имеет тип «cv T», где T - неквалифицированный cv некласс, не массив, тип выражения корректируется до T перед любым дальнейшим анализом.

Или это так?

например. какие временные мы получаем в этом примере

const int &r = 42;

Временный const или нет? Можем ли мы сделать

const_cast<int &>(r) = 101; // Undefined or not?

без запуска неопределенного поведения? Если я не ошибаюсь, первоначальная цель заключалась в получении временного const int в таких случаях. Это все еще правда? (Для типов классов ответ ясен - мы получаем const временно.)

...