在乘以2个const整数时澄清decltype输出

时间:2016-09-18 18:17:44

标签: c++ c++11 c++14 decltype

int main()
{
 const int a = 1;
 const int b = 2;
 typedef decltype(a*b) multiply_type;
 cout << typeid(multiply_type).name() << endl;
 return 0;
}

程序的返回值是multiply_type是int。我很惊讶。我期望类型推导产生const int,并且由于表达式产生pr值,因此结果类型将是const int。

PS:使用auto时,返回值将为int,因为它会删除const限定符。

任何想法为什么multiply_type是int而不是带有decltype的const int?

编辑:添加了一个与cv-qualifier相关的附加示例。

#include<iostream>
#include<typeinfo>


using namespace std;

struct Details
{
    int m_age;
};

int main()
{
 const Details* detail = new Details();
 typedef decltype((detail->m_age)) age_type;
 cout << typeid(age_type).name() << endl;

 int a = 1;
 age_type age = a;
 age = 10; // This is not possible. Read only. 
 cout << typeid(age).name() << endl; // This returns the type as int though. Then why is 20 not possble ?
 return 0;

}

编辑2:检查我们的链接。 this post `

int x;
const int& crx = x;
/ The type of (cx) is const int. Since (cx) is an lvalue,
// decltype adds a reference to that: cx_with_parens_type
// is const int&.
typedef decltype((cx)) cx_with_parens_type;` 

1 个答案:

答案 0 :(得分:1)

decltype按原样评估它的参数,decltype(i)其中i cv-qualified 左值,导致声明类型为cv-qualified,但表达式i*i中的decltype(i*i)创建了一个非实体化的prvalue,类型为i,非 cv-qualified ,prvalue没有明确的constness概念。您的代码与:

相同
using T = const int;
static_assert(is_same<int, decltype(0)>(), "Failed");

typeid未显示cv资格的事实是因为忽略了它们:

  

5.2.8.5 - 如果表达式或type-id的类型是cv限定类型,则typeid表达式的结果引用表示cv-unqualified类型的std :: type_info对象。