decltype错误C2440无法从'int*'转换为'int*&'

vex*_*exe 3 c++ decltype

以下是实际代码的人为例子:

int** Ptr = 0;
decltype(Ptr[0]) Test = (int*)0;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误C2440:'初始化':无法从'int*'转换为'int*&'

我不知道为什么我会得到这个,因为从我的理解decltype(纠正我,如果我错了)它只需要你给它的任何表达并解决它的实际类型.在这种情况下Ptr[0]int*我所期待的:int* Test = (int*)0;

我错过了什么?为什么我会收到这个错误?

Sha*_*our 5

如果我们转到草案C++标准部分7.1.6.2简单类型说明符[dcl.type.simple]并查看他的情况.对于decltype,它开始说:

对于表达式e,由decltype(e)表示的类型定义如下:

我们看到,在这种情况下,表达式不是id-expression,也不是类成员访问,这将给出你期望的结果(强调我的):

  • 如果e是未表示的id-expression或未加密的类成员访问(5.2.5),则decltype(e)是e所命名的实体的类型.如果没有这样的实体,或者如果e命名了一组重载函数,那么该程序就会形成错误;

但结果是左值:

  • 否则,如果e是左值,则decltype(e)是T&,其中T是e的类型;

这导致参考.

正如MM指出的那样std :: remove_reference可用于获得你想要的结果:

std::remove_reference<decltype(Ptr[0])>::type Test = (int*)0;
Run Code Online (Sandbox Code Playgroud)

正如TC指出的那样,std :: decay也是一种选择而且更短:

std::decay<decltype(Ptr[0])>::type Test = (int*)0;
Run Code Online (Sandbox Code Playgroud)