使用decltype从指针推导类型

bot*_*aio 1 c++ decltype visual-studio-2015

尝试执行此代码时,VS2015会抛出很多错误:

int a = 5;
int *p = &a;
std::vector<decltype(*p)> v;
Run Code Online (Sandbox Code Playgroud)

但是,当我检查这个decltype返回的类型时,我得到一个int!

typeid(decltype(*p)) == typeid(int) // returns true
Run Code Online (Sandbox Code Playgroud)

有谁可以向我解释一下?我通过简单地解除引用指针和decltyping我得到的值来完成解决方法.但是为什么不能通过直接取消引用指针来实现呢?

R S*_*ahu 7

作为@Brian提出的解决方案的替代方案,您可以使用:

std::vector<std::remove_reference<decltype(*p)>::type> v;
Run Code Online (Sandbox Code Playgroud)

您还可以使用:

std::vector<std::remove_pointer<decltype(p)>::type> v;
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<std::decay<decltype(*p)>::type> v3;
Run Code Online (Sandbox Code Playgroud)

  • @Barry或`decay <decltype(*p)>`:) 8个字符更短,并正确处理`const int*`. (4认同)
  • 或者`remove_pointer <decltype(p)>`,这是*三个*字符更短:) (2认同)

Bri*_*ian 5

decltype(*p)int&,不是int,你不能有一个引用的向量.遗憾的typeid是,由于它剥离了引用和cv限定符,因此不会公开这种差异.

这有效:

 std::vector<decltype(a)> v;
Run Code Online (Sandbox Code Playgroud)

  • 但问题是如何从指针中推断出类型,而'a`则不是. (2认同)