[英]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.