int main() {
pair<int, int> res;
// check here pair is empty ?
// res = make_pair(1 , 2);
return 0;
}
在以上代码段中,检查一对是否已初始化的理想方法是什么?
编辑:正如下面一些答案所指出的那样,此处使用“未初始化”一词是错误的,更具体地说,如何检查是否已明确设置该值(默认构造函数除外)
答案 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.first
和res.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::pair
为空。 std::pair
的默认构造函数将对这两个元素的值进行初始化,这意味着对于pair<int, int> res;
,其first
和second
将被初始化为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