繁体   English   中英

decltype作为类成员函数中的返回类型

[英]decltype as a return type in class member function

我在代码下面编译错误。

struct B{
    double operator()(){
        return 1.0;
    }
};

struct A {
    auto func() -> decltype(b())
    {
        return b();
    }

    B b;
};

但是,如果我重组A ,它会编译。

gcc 4.8表示'b'未在此范围内声明。

struct A {
    B b;
    auto func() -> decltype(b())
    {
        return b();
    }
};

那么,第一个出了什么问题?

有效吗?

你的最后一个例子是格式良好的,而第一个例子不是(所以GCC是正确的)。

关于非限定名称查找的第3.4.1 / 7段规定:

成员函数体之外的X的定义中使用的名称,非静态数据成员的默认参数, brace-or-equal-initializer或嵌套类定义应使用以下方式之一声明

- X类中使用之前或者是X(10.2)基类的成员,或者

- [...]

以下是其他不适用于您的情况。

class的定义经过两次处理:首先收集成员声明,​​包括函数签名 ,然后解析定义的主体。

因此,函数体可以访问所有成员声明,​​包括后续声明,但函数原型只能看到前面的声明。

你也可以这样工作:

struct B
{
    double operator()()
    {
        return 1.0;
    }
};

// my implementation does not have std::declval
template < typename T > T&& declval();

struct A
{
    B b;
    auto func() -> decltype(declval<B>().operator()())
    {
        return b();
    }
};

编辑:或者因为B已经在范围内,无论如何不需要auto, - > decltype和declval

struct A
{
    B b;
    decltype(Q()()) func()
    {
        return b();
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM