在某些情况下,将auto用作返回类型和返回值nullptr

时间:2019-07-06 17:03:07

标签: c++ c++14

如果我们有返回类型为auto的方法,但是在方法中我们将返回一个新对象或nullptr。 如果我正确理解何时返回nullptr,它将通过构造函数创建新对象。

方法是With

下一个问题: 将使用哪种类型代替auto? 它取决于是否由maybe返回的类型: maybe是一个返回Maybe<T>的函数。 当我们首先调用With时,返回类型为Maybe< Adress >; 第二步,它可能是Maybe< Adress >,因为它是对象的类型,或者是Maybe< std::string >-如果上下文不是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

}

2 个答案:

答案 0 :(得分:2)

  

将使用哪种类型代替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>被转换为C对象(其上下文为null)。同样,我使用的是T而不是*this,因为此类型不必是context类型的模板参数。无论Maybe的值如何,返回的类型都是相同的。

如果您希望看到此隐式转换中断,请像explicit Maybe(T *context) : context(context) { }一样,将转换明确地转换为<table><tbody><tr><th>CHILD </th><th>FATHER </th><th>MOTHER</th></tr><tr><td>Jhon Morris </td><td>David Morris </td><td>Alicia Morris</td></tr><tr><td>Charles Reed </td><td>George Reed </td><td>Megan Reed</td></tr><tr><td>Daniel Morris </td><td>David Morris </td><td>Alicia Morris</td></tr><tr><td>Anthony Morris </td><td>Ronald Morris </td><td>Mary Morris</td></tr></tbody></table>

答案 1 :(得分:0)

auto并不神奇。它只是一个占位符,您的编译器将其填充为具体的推断类型。最终结果与您手动编写推断类型完全相同

“如果我正确理解何时返回nullptr,它将通过构造函数创建新对象”。否。返回nullptr不会调用任何构造函数。它只是返回适当类型的空值。没有构造对象。

“哪种类型将改为自动”-返回元组将是您实际上返回的类型。而且只能是一个特定类型。