decltype 错误 C2440 无法从'int *'转换为'int *&'
decltype error C2440 cannot convert from 'int *' to 'int *&'
以下是实际代码的一个人为示例:
int** Ptr = 0;
decltype(Ptr[0]) Test = (int*)0;
我得到错误:
错误C2440:"initializing":无法从"int*"转换为"int*&"
我不知道为什么会这样,因为根据我对decltype
的理解(如果我错了,请纠正我),它只需要你给它的任何表达式,并将其解析为它的实际类型。在这种情况下,Ptr[0]
是int*
,所以我期待:int* Test = (int*)0;
我错过了什么?为什么我会犯那个错误?
如果我们进入C++标准草案7.1.6.2
简单类型说明符[dcl.type.Simple],看看有什么情况,对于decltype,它一开始说:
对于表达式e,decltype(e)表示的类型定义如下:
我们看到,在这种情况下,表达式既不是id表达式,也不是类成员访问,这将给出您期望的结果(emphasis mine):
- 如果e是一个未加括号的id表达式或一个未带括号的类成员访问(5.2.5),则decltype(e)是由e命名的实体的类型。如果不存在这样的实体或者如果e命名一组重载函数,程序格式不正确
但结果是一个左值:
- 否则,如果e是左值,则decltype(e)是T&,其中T是e的类型
这导致参考。
正如M.M所指出的,std::remove_reference可以用于获得您想要的结果:
std::remove_reference<decltype(Ptr[0])>::type Test = (int*)0;
正如T.C.所指出的,std::衰变也是一种选择,并且更短:
std::decay<decltype(Ptr[0])>::type Test = (int*)0;
除了所有其他答案外,您还可以只使用
int ** ptr = 0;
decltype(+ptr[0]) test = (int*)0;
// (+*p) is now an r-value expression of type int, rather than int&
这里使用的一些规则是:
- 如果表达式的值类别是左值,则decltype产生T&
- 如果表达式的值类别是prvalue,则decltype产生T
还要注意的是,如果对象的名称用括号括起来,它将被视为一个普通的左值表达式,因此decltype(x)和declttype((x))通常是不同的类型。[摘录自https://en.cppreference.com/w/cpp/language/decltype]
在http://www.cplusplus.com/forum/beginner/149331/
有关decltype的更多信息,请点击此处:https://en.cppreference.com/w/cpp/language/decltype
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度