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)