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