繁体   English   中英

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

[英]decltype error C2440 cannot convert from 'int *' to 'int *&'

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

int** Ptr = 0;
decltype(Ptr[0]) Test = (int*)0;

我收到错误:

错误 C2440:“正在初始化”:无法从“int *”转换为“int *&”

我不确定为什么我会得到它,因为根据我对decltype理解(如果我错了,请纠正我)它只需要你给它的任何表达式并将其解析为它的实际类型。 在这种情况下Ptr[0]是一个int*所以我期待: int* Test = (int*)0;

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

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

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

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

  • 如果e 是无括号的 id 表达式或无括号的类成员访问 (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;

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

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&;
  • 如果表达式的值类别是纯右值,则 decltype 产生 T。

还要注意,如果一个对象的名称被括号括起来,它被视为一个普通的左值表达式,因此 decltype(x) 和 decltype((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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM