检查对是否为空或未初始化

时间:2019-07-19 09:06:14

标签: c++ std-pair

 int main() {

   pair<int, int> res;
   // check here pair is empty ?
   // res = make_pair(1 , 2);


   return 0;
}

在以上代码段中,检查一对是否已初始化的理想方法是什么?

编辑:正如下面一些答案所指出的那样,此处使用“未初始化”一词是错误的,更具体地说,如何检查是否已明确设置该值(默认构造函数除外)

4 个答案:

答案 0 :(得分:5)

没有统一的std::pair之类的东西。

std::pair

Default constructor将对其两个成员进行 value-initialize ,这对int对意味着两个int都将具有值0。

答案 1 :(得分:4)

  

在以上代码段中,检查一对是否已初始化的理想方法是什么?

您检查了自己喜欢的语言参考并意识到了

  • std::pair需要默认可构造的类型和

  • std::pair默认构造函数会默认初始化其数据成员。

因此

std::pair<int, int> res;

将导致res.firstres.second均为零。


当您需要向对象添加其他空状态时,始终可以选择将其显式地包装到std::optional中(如果不能使用C ++ 17,则可以将其包装到boost::optional中)。这样,您随时可以检查自己是否具有有意义的std::pair

#include <optional>

std::optional<std::pair<int, int>> res;

if (res) // the pair is initialized and usable
   doStuff(*res);
else // ... it's not, hence initialize it
   res = std::make_pair(42, 43);

答案 2 :(得分:3)

这取决于您如何定义std::pairstd::pair的默认构造函数将对这两个元素的值进行初始化,这意味着对于pair<int, int> res;,其firstsecond将被初始化为0。如果保证在分配后确保它们不为零,那么这是检查默认构造的std::pair的唯一方法。

答案 3 :(得分:0)

您可以编写类似于以下内容的功能

namespace usr
{
    template <class T1, class T2>
    bool empty( const std::pair<T1, T2> &p )
    {
        return p == std::pair<T1, T2>();
    }
}

这是默认的初始化对,将被视为安培。

这是一个演示程序

#include <iostream>
#include <utility>

namespace usr
{
    template <class T1, class T2>
    bool empty( const std::pair<T1, T2> &p )
    {
        return p == std::pair<T1, T2>();
    }
}

int main()
{
    std::pair<int, int> p1( 1, 2 );

    std::cout << usr::empty( p1 ) << '\n';

    std::pair<int, int> p2;

    std::cout << usr::empty( p2 ) << '\n';
}

其输出为

0
1