簡體   English   中英

在某些情況下,將auto用作返回類型和返回值nullptr

[英]Using auto as return type and return value nullptr in some cases

如果我們具有返回類型為auto的方法,但是在該方法中,我們將返回一個新對象或nullptr 如果我正確理解何時返回nullptr ,它將通過構造函數創建新對象。

方法With

接下來的問題是:將使用哪種類型代替auto 這將取決於類型通過返回maybe與否: maybe是返回的函數Maybe<T> 當我們第一次調用With返回類型為Maybe< Adress > 第二步,可能是Maybe< Adress >因為它是對象的類型,或者Maybe< std::string > -如果context不是nullptr則返回。

struct Address {
    string* house_name = nullptr;
};

struct Person {
    Address* address = nullptr;
};

template <typename T> struct Maybe;

template <typename T> Maybe<T> maybe(T* context)
{
   return Maybe<T>(context);
}

template <typename T>
struct Maybe {
    T* context;

    Maybe(T *context) : context(context) { }

    template <typename TFunc>
    auto With(TFunc evaluator)
    { 
        return context != nullptr ? maybe(evaluator(context)) : nullptr;
    }
 };

 ...

 void print_house_name(Person* p)
 {
    auto z = maybe(p)
    .With([](auto x) { return x->address; })
    .With([](auto x) { return x->house_name; })
    .Do([](auto x) { cout << *x << endl; });
 }


int main()
{
   //print_house_name(nullptr);

   Person p;

   print_house_name(&p); // nothing

}

哪種類型將代替auto

函數的返回類型由單個return語句中的表達式類型決定。 您的情況是:

return context != nullptr ? maybe(evaluator(context)) : nullptr;

返回的表達式是一個三元運算符,其兩個潛在值具有不同的類型( Maybe<C> ,對於某些類C不一定是T ,並且為nullptr_t )。 僅當其中一種類型可以隱式轉換為另一種類型時,這種格式才正確。 通常, nullptr_t僅與其他指針類型進行轉換,因此讓我們看一下為Maybe定義的隱式轉換(只有一個):

Maybe(T *context) : context(context) { }

指針類型可以轉換為Maybe 因此,將nullptr轉換為C* ,然后將其轉換為Maybe<C>對象(其上下文為null)。 同樣,我使用C而不是T因為此類型不必是*this類型的一部分的同一模板參數。 無論context的值如何,返回的類型都是相同的。

如果您希望看到這種隱式轉換中斷,請像explicit Maybe(T *context) : context(context) { }一樣,將轉換轉換為Maybe

auto不是魔術。 它只是一個占位符,您的編譯器將其填充為具體的推斷類型。 最終結果您手動編寫推斷類型完全相同

“如果我正確理解何時返回nullptr,它將通過構造函數創建新對象”。 否。返回nullptr不會調用任何構造函數。 它只是返回適當類型的空值。 沒有構造對象。

“哪種類型將代替汽車” -返回TUPE將是什么的你實際上會返回類型 那只能是一種特定的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM