奇怪的对象实例化

时间:2015-12-11 21:49:05

标签: c++

在Bjarne Stroustrup的书:Tour of C ++中,我找到了以下片段:

void test(){
 string input = "aa as; asd ++easdf asdfg";
 regex pat {R"(\s+(\w+))"};
 for (sregex_iterator p(input.begin(),input.end(),pat); p!=sregex_iterator{}; ++p)
  cout << (*p)[1] << '\n';
}

我在理解sregex_iterator{}做什么时遇到了问题。这是什么声明?构造函数?初始化列表?

2 个答案:

答案 0 :(得分:4)

通过调用默认构造函数(使用统一语法)创建类型为std::sregex_iterator的(临时)对象。从C ++ 14开始,该标准要求所有对ForwardIterator概念建模的类型都是DefaultConstructible,并且默认构造的迭代器代表一个过去的迭代器。

来自cppreference

  

奇异迭代器(自C ++ 14开始)

     

值初始化ForwardIterator的行为类似于某个未指定的空容器的过去迭代器:它与同一类型的所有值初始化ForwardIterators相等。

所以完整的p!=sregex_iterator{};语句检查迭代器p是否还没用完。

答案 1 :(得分:2)

它使用C ++ 11中引入的Uniform Initialization调用默认构造函数。