C++ 是否可以在带有初始化的函数指针声明中使用'auto'关键字作为返回类型?
以下代码(编译标志为C++ 是否可以在带有初始化的函数指针声明中使用'auto'关键字作为返回类型?,c++,initialization,language-lawyer,function-pointers,auto,C++,Initialization,Language Lawyer,Function Pointers,Auto,以下代码(编译标志为-std=c++14-O0-Wall-Wextra-Werror-pedantic errors): #包括 int foo_int(int) { std::cout编译器运行正常 从 auto和decltype(auto)类型说明符用于指定占位符类型,该占位符类型稍后将由初始值设定项中的推断替换 [……] auto或decltype(auto)应显示为decl说明符序列中的一个decl说明符,decl说明符序列后面应跟随一个或多个声明符,每个声明符后面应跟随一个非空初始值设
-std=c++14-O0-Wall-Wextra-Werror-pedantic errors
):
#包括
int foo_int(int)
{
std::cout编译器运行正常
从
auto
和decltype(auto)
类型说明符用于指定占位符类型,该占位符类型稍后将由初始值设定项中的推断替换
[……]
auto
或decltype(auto)
应显示为decl说明符序列中的一个decl说明符,decl说明符序列后面应跟随一个或多个声明符,每个声明符后面应跟随一个非空初始值设定项
也就是说,auto
和decltype(auto)
只能使用您在声明前面编写的说明符(static
,virtual
等)来编写,它们的类型是从紧跟其后的带有初始值设定项的声明符推导出来的
auto
在auto(*fi)(int)=foo_int;
的情况下,声明符是(*fi)(int)
,其形式如下
( ptr-operator declarator-id ) ( parameter-declaration-clause )
因此,auto(*fi)(int)=foo_int;
是有效的,前提是它是有效的。对于其他几个也是如此
decltype(自动)
From,给定包含占位符类型的类型T
如果占位符是decltype(auto)
类型说明符,T
应单独作为占位符
这意味着添加任何其他内容都是非法的
int i;
decltype(auto)* p = &i; // error, declared type is not plain decltype(auto)
因此,decltype(auto)(*fi)(int)=foo_int;
是非法的。你为什么不直接写auto p=foo_int;
…?@我当然可以。我只是想知道这样的结构是否有效。decltype(auto)
必须在声明中单独出现。它的演绎略有不同,因此它所发生的任何事情都与声明中的auto
所发生的事情无关。@StoryTeller我只是想用这种奇怪的结构尝试一些其他变体。auto
在函数参数中也会被拒绝ers字段(类似于void(*f)(auto)=…
也不编译)。只有auto
作为返回类型才能成功编译。很有趣,谢谢。所以这只是一般规则中一个奇怪的特殊情况,不是吗?@Constructor是的,最常见的用例是声明符仅是一个声明符id,auto i=42;
@Constructor:不。你为什么称它为“特殊”呢?像auto&r
、或auto&r
或auto*p
这样的用法是完全主流的。这些示例在概念上与您的示例没有任何不同:&
和*
也不是desc说明符seq的一部分。它们是单个声明符的一部分,就像您的(int)一样
。您的示例可能来自“很少使用”类别,但底层的形式结构一点也不特殊。@AnT是的,我理解。“特殊”一词在这种情况下并不合适。“很少使用”更合适。
int i;
decltype(auto)* p = &i; // error, declared type is not plain decltype(auto)