为什么不能在C++11或更高版本的函数声明中定义结构
Why can structs not be defined in a function declaration in C++11 or higher?
我试图实现的主要是从C++11中的一个函数返回一个未命名的结构。在C++14中,我可以通过定义内联函数并将auto
作为返回类型来实现这一点,如下所示:
auto func()
{
struct
{
int member;
} ret;
// set ret.member
return ret;
}
然而,C++11不支持推导普通(非lambda)函数的返回类型,并且只有在内联定义时,这才适用于C++14。
我尝试了以下两种在函数声明中声明结构的变体:
auto func() -> struct { int member; };
struct { int member; } func();
这在C++11中根本不可能实现吗?如果是这样,是否有人知道这是故意禁止的,或者只是没有人想到这种自动推导类型的新用法(因为这只适用于分配给auto
变量的函数返回值)?
最后,还有其他方法可以实现类似的目标吗?我知道std::tuple
,但我想命名这些值;在我的用例中,structtype肯定只作为这一个函数的返回类型有用,那么为什么要命名它呢?
[dcl.fct]/p11:
类型不应在返回类型或参数类型中定义。
据我所知,这在C++11中并不新鲜。
类说明符由类名和{ }
组成。一旦遇到右大括号,就会定义类。如果省略了类头名称,则该类未命名(§9)。类型说明符可以有类说明符部类型说明符不能(只允许简单类型说明符、详细类型说明符、类型名说明符和cv限定符,§7.1.6)。因此,我认为不可能将类的定义放在后部返回类型中。
来源:N4140
相关文章:
- Visual Studio中的函数声明和函数定义问题
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- * 和 ** 在 C++ 函数声明中是什么意思?
- 构造函数/函数声明参数列表中的统一初始化
- 在将函数声明为友元时,尖括号的含义是什么?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 如何正确编写指针函数声明?
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 为什么要将函数声明和定义放在单独的文件中
- 为什么系统日志有两个不同的函数声明?
- 我如何获取数组的大小,以便我可以从函数声明所述数组
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- JavaScript 中的一等函数和 C++ 中的函数声明
- C++ 通过函数声明后初始化向量
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- C++ 17 个友元函数声明和内联命名空间
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 将派生类的构造函数声明为父类的友元
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明