首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >decltype(*&fun)是不是很奇怪?

decltype(*&fun)是不是很奇怪?
EN

Stack Overflow用户
提问于 2012-02-27 23:42:22
回答 1查看 257关注 0票数 4

我有:

代码语言:javascript
复制
#include <type_traits>
#include <stdio.h>

void f() { printf("foo\n"); }

int main()
{
  printf("%d %d %d\n",
    std::is_same<decltype(*&f),decltype(f)>::value,
    std::is_function<decltype(*&f)>::value,
    std::is_function<decltype(f)>::value);
  (*&f)();
  return 0;
}

哪一项会产生

代码语言:javascript
复制
0 0 1
foo

在g++ 4.6.1和4.7.0上。

有人能给我解释一下吗?

EN

回答 1

Stack Overflow用户

发布于 2012-02-28 02:12:03

需要注意的是,decltype有两层含义:它可以用来查找实体的声明类型(因此而得名),也可以用来检查表达式。我在这里松散地使用entity,并不是指标准中的任何术语,但简单地说,它可以是一个变量,一个函数,或者(在我看来很奇怪)一个成员访问。检查表达式时返回的类型通常与表达式本身的类型不同,因此:

代码语言:javascript
复制
int i;
void foo();
struct { int i; } t;

static_assert( std::is_same<decltype( i ),     int>::value,       "" );
static_assert( std::is_same<decltype( foo ),   void()>::value,    "" );
static_assert( std::is_same<decltype( t.i ),   int>::value,       "" );

static_assert( std::is_same<decltype( (i) ),   int&>::value,      "" );
static_assert( std::is_same<decltype( (foo) ), void(&)()>::value, "" );
static_assert( std::is_same<decltype( (t.i) ), int&>::value,      "" );

注意函数是如何工作的,因此在您的示例中,decltype(*&f)decltype( (f) )相同,而不是decltype(f)

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9467791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档