使用decltype作为成员函数返回类型时,声明顺序很重要

时间:2014-04-17 14:58:53

标签: c++11 decltype

为什么这样做:

template<typename Base, typename Acc>
struct Foo
{
    Base base;
    Acc acc;

    auto operator()(unsigned i) const -> decltype(acc(base(i)))
    { return acc(base(i)); }
};

这会产生编译错误:

template<typename Base, typename Acc>
struct Foo
{
    auto operator()(unsigned i) const -> decltype(acc(base(i)))
    { return acc(base(i)); }

    Base base;
    Acc acc;    
};
  

错误:“base”没有依赖于模板的参数   参数,所以'base'的声明必须是[-fpermissive]

这是否真的是标准或GCC 4.8.1的错误?


我找到了一个更短的示范示例:

#include <iostream>

struct Foo
{
    int x;

    auto getx() const -> decltype(x) // OK
    { return x; }

    auto gety() const -> decltype(y) // ERROR
    { return y; }

    int gety2() const // OK
    { return y; }

    int y;
};

int main(int argc, char* argv[])
{
    Foo f {1,2};
    std::cout << f.getx() << std::endl;
    std::cout << f.gety() << std::endl;
}

1 个答案:

答案 0 :(得分:2)

预计在函数声明之前只声明成员。如标准§5.1.1项目3中所示:

  

如果声明声明了成员函数... [注意:只有先前声明的类成员   声明是可见的。 - 后注]