C++中可以使用匿名类作为返回类型吗?

问题描述 投票:0回答:6

有没有办法在C++中使用匿名类作为返回类型?

我用谷歌搜索这可能有用:

struct Test {} * fun()
{
}

但是这段代码无法编译,错误信息是:

新类型不能在返回类型中定义

其实代码没有任何意义,我只是想弄清楚C++中是否可以使用匿名类作为返回类型。

这是我的代码:

#include <typeinfo>
#include <iterator>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>

using namespace std;

int main(int argc, char **argv)
{
    int mx = [] () -> struct { int x, y ; } { return { 99, 101 } ; } ().x ;
    return 0;
}

我用 g++ xx.cpp -std=c++0x 编译这段代码,编译器抱怨:

expected primary-expression before '[' token.
c++ anonymous-types anonymous-class
6个回答
7
投票

注意:这些代码片段在最新版本的 g++ 中不再有效。我用 4.5.2 版本编译它们,但 4.6.1 和 4.7.0 版本不再接受它们。


可以声明一个匿名结构作为 C++11 中 lambda 函数的返回类型。但它并不漂亮。此代码将值 99 分配给

mx
:

int mx = [] () -> struct { int x, y ; } { return { 99, 101 } ; } ().x ;

ideone 输出在这里:http://ideone.com/2rbfM

响应程老师的要求:

lambda 函数是 C++11 中的新功能。它基本上是一个匿名函数。这是 lambda 函数的一个更简单的示例,它不带参数并返回

int
:

[] () -> int { return 99 ; }

您可以将其分配给变量(您必须使用

auto
来执行此操作):

auto f = [] () -> int { return 99 ; } ;

现在你可以这样称呼它:

int mx = f() ;

或者你可以直接调用它(这就是我的代码所做的):

int mx = [] () -> int { return 99 ; } () ;

我的代码只是使用

struct { int x, y ; }
代替
int
。末尾的
.x
是应用于函数返回值的正常
struct
成员语法。

这个功能并不像看起来那么无用。您可以多次调用该函数来访问不同的成员:

auto f = [] () -> struct {int x, y ; } { return { 99, 101 } ; } ;
cout << f().x << endl ;
cout << f().y << endl ;

您甚至不必调用该函数两次。这段代码完全符合OP的要求:

auto f = [] () -> struct {int x, y ; } { return { 99, 101 } ; } () ;
cout << f.x << endl ;
cout << f.y << endl ;

5
投票

不是他们不能。如错误消息所示,来自 ISO/IEC 14882:2011 8.3.5/9:

不得在返回类型或参数类型中定义类型。函数定义的参数类型或返回类型不应是不完整的类类型(可能是 cv 限定的),除非函数定义嵌套在该类的成员规范中(包括该类中定义的嵌套类中的定义) ).

当然,您不能将现有的匿名类型命名为函数声明中的返回类型,因为匿名类没有名称。

虽然您可以为未命名的类创建

typedef
并将其用作返回类型,但由于 typedef 名称成为用于链接目的的类类型的名称,因此该类不再真正是匿名的。


3
投票
struct Test {} * a;
decltype(a) fun() {
  return a;
}

顺便说一句,

struct Test {}
不是匿名结构。


3
投票

您能得到的最接近您想要的就是这个,在 C++14 中:

auto f() { 
    struct {
        int x, y;
    } ret{10,24};
    return ret;
}
int main() {
  printf("%i", f().x);
}

该结构体未命名(ret 是变量名,而不是类型名),并被返回。

如果需要,您仍然可以通过

获取它
using my_struct = decltype(f());
my_struct another; another.x++;

2
投票

不,你不能像 C++ 中那样做匿名类型。

但是,您可以使用

typedef
为匿名类型分配新名称。

typedef struct
{
    unsigned x;
    unsigned y;
} TPoint;

1
投票

@Charles 的帖子几乎直接引用规范回答了问题。

现在,我想为什么anonymous类型不能作为函数的返回类型,是因为假设

f
返回匿名类型,那么在调用站点会写什么?

?????  obj = f();

上面代码中的

?????
应该写什么?

© www.soinside.com 2019 - 2024. All rights reserved.