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;`
答案 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对象。