如何优雅地返回默认初始化的对象?

xml*_*lmx 8 c++ return default-value default-constructor c++11

我有一个类如下:

class VeryVeryVeryLongTypeName
{
    bool is_ok;

    VeryVeryVeryLongTypeName() : is_ok(false) {}
};

VeryVeryVeryLongTypeName f()
{
    VeryVeryVeryLongTypeName v;

    ... // Doing something

    if (condition_1 is true)
    {
        return v;
    }
    else
    {
        return VeryVeryVeryLongTypeName();
    }

    ... // Doing something

    if (condition_2 is true)
    {
        return v;
    }
    else
    {
        return VeryVeryVeryLongTypeName();
    }    
}
Run Code Online (Sandbox Code Playgroud)

我认为这个陈述return VeryVeryVeryLongTypeName();非常乏味和丑陋,所以,我的问题是:

如何优雅地返回默认初始化的对象?

或换句话说:

将功能添加到C++标准中以使以下声明合法是一个好主意吗?

return default; // instead of return VeryVeryVeryLongTypeName();
Run Code Online (Sandbox Code Playgroud)

goj*_*oji 17

这非常简洁:

   return {};
Run Code Online (Sandbox Code Playgroud)

  • 当ctor被标记为"explicit"时,它不起作用. (5认同)
  • 我想在一些代码中使用它只是为了给我的团队领导一些建议。这会让我成为一个坏人吗? (2认同)
  • @Troy:我想我可能误解了你的评论.这是另一个[用例](http://coliru.stacked-crooked.com/a/76e91d9aaf8f4760). (2认同)

Naw*_*waz 9

您可以使用此类,其实例将自动隐式转换为所需类型的实例.即使标记了默认构造函数explicit 或者您仍在使用C++ 03,这也应该有效.对于C++ 11,接受的答案简洁而且更好.

const struct default_t
{
     template<typename T>
     operator T() const {   return T{}; }
}default_{};
Run Code Online (Sandbox Code Playgroud)

并将其用作:

VeryVeryVeryLongTypeName f()
{
     //...
     return default_;
}

WithExplicitConstructor_VeryVeryVeryLongTypeName g()
{
     //...
     return default_;
}
Run Code Online (Sandbox Code Playgroud)

在线演示.

您可以在任何地方使用此解决方案,即使在模板中

template<typename T>
typename father::template daughter<T>::grand_son_type h()
{
     //...
     return default_;
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • @cdmh我建议你打开一个新问题,如果你不知道为什么`explicit`与这个问题有关. (2认同)