簡體   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