cv квалификаторы в decltype для выражения prvalue - PullRequest
0 голосов
/ 21 декабря 2018

Этот вопрос возник во время моего изучения поведения decltype и его правил определения типа выражений.Есть ли причина не продвигать общие cv-квалификаторы, если выражение имеет значение prvalue?тип.Пример: - в приведенном ниже коде выражение i+j просто получается из decltype как int, а не const int, так как const ness является общим для обеих переменных, оно также может быть распространено на результирующее выражение,хотя само выражение является временным и не является lvalue, но когда дело доходит до деривации типа, оно может быть полезно (как в случае с выражениями с одним значением).

Существующее правило: если категория значений выраженияэто значение, тогда decltype дает T.

#include<iostream>
#include<string>
#include<type_traits>

using namespace std;

int main(int argc, char* argv[])
{
 const int i=10;
 const int j=20;  
 cout << is_same<decltype(i), const int>::value << "," << is_same<decltype(j), const int>::value << endl; 
 cout << is_same<decltype(i+j), const int>::value << "," << is_same<decltype(i+j), int>::value << endl;  
 return(0); 
}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Согласно стандартному проекту CPP n4713:

8.2.1 Категория значения [basic.lval]
...
9. ...Класс prvalues ​​может иметь cv-квалифицированные типы;не-классные значения типа prvalue всегда имеют cv-неквалифицированные типы.

Так как (i + j) оценивается как non-class prvalue, он будет иметь тип cv-unqualified и использование decltype для него дает int.

0 голосов
/ 21 декабря 2018

Я думаю, decltype(i+j) будет зависеть от того, как operator+ определено для i и j, и не будет основано на каких-либо правилах продвижения, основанных на самих i и j.

Относительно того, почему это не const, я полагаю, что после этого будет очень трудно применить конструкцию / назначение перемещения, и это считается важной оптимизацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...