I have:
#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;
}
这产生
0 0 1
foo
在 g++ 4.6.1 和 4.7.0 上。
谁能向我解释一下吗?
重要的是要注意decltype
有两个含义:它可用于查找声明的类型(因此得名)entity,或者它可以用来检查表达。我在这里松散地使用实体,并不是指标准的任何术语,但简单地说,它可以是变量、函数或(在我看来很奇怪)成员访问。检查表达式时返回的类型通常与表达式本身的类型不同,因此:
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) )
, not decltype(f)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)