C++ C++;boostforeach与自定义宏

C++ C++;boostforeach与自定义宏,c++,boost,macros,iterator,boost-iterators,C++,Boost,Macros,Iterator,Boost Iterators,使用BOOST的ForEach和我自己的自定义#define宏迭代容器有什么区别 地雷: #为(typeof(x.begin())i=x.begin();i!=x.end();++i)定义迭代(i,x) 促进: #包括 #包括 #包括 int main() { string hello(“你好,世界!”); BOOST_FOREACH(char ch,你好) { std::cout第一个大区别是,当您使用右值时,如下所示: vector<int> foo(); // foo() i

使用BOOST的ForEach和我自己的自定义#define宏迭代容器有什么区别

地雷:

#为(typeof(x.begin())i=x.begin();i!=x.end();++i)定义迭代(i,x)
促进:
#包括
#包括
#包括
int main()
{
string hello(“你好,世界!”);
BOOST_FOREACH(char ch,你好)
{

std::cout第一个大区别是,当您使用右值时,如下所示:

vector<int> foo();

// foo() is evaluated once
BOOST_FOREACH(int i, foo())
{

}

// this is evaluated twice(once for foo().begin() and another foo().end())
iterate(i, foo())
{

}
vector foo();
//foo()只计算一次
BOOST_FOREACH(inti,foo())
{
}
//这将计算两次(一次用于foo().begin(),另一次用于foo().end())
迭代(i,foo())
{
}
这是因为
BOOST\u FOREACH
检测它是否为右值并生成一个副本(编译器可以省略)

第二个区别是
BOOST\u FOREACH
用于检索迭代器。这使得它可以轻松扩展。因此它可以在数组和
std::pair
上工作


第三个区别是,
iterate
宏自动推断范围的类型,这在支持
typeof
但不支持
auto
的较旧编译器上非常方便。但是,
BOOST\u FOREACH
将在所有C++03编译器上运行。

BOOST可能已将其代码配置为在没有非标准的
typeof
扩展。一个区别是
BOOST\u FOREACH
使用普通数组,即
chara[]={“你好,世界!”}你不应该依赖于<代码> Type of < /C> >,这不是标准C++。你应该使用<代码> DeCype < /Cord> @ MariusBancila,如果你有一个支持<代码> DECKECTON/CODE >的编译器,那么它也很可能支持循环的<>代码>,在这种情况下,宏都是多余的。VS2010支持前者,但不支持后者:-S@Praetorian,完全同意。你似乎在暗示
BOOST\u-FOREACH
只在支持
auto
的编译器上工作。那不是真的。
BOOST\u-FOREACH
不使用任何C++11功能,事实上在非常古老的编译器上工作。
BOOST\u-FOREACH
是100%符合C++03,这是它与OP的
迭代
宏之间的另一个区别。@EricNiebler抱歉,我不是有意暗示它需要
自动
,我更正了它以使它更清晰。
vector<int> foo();

// foo() is evaluated once
BOOST_FOREACH(int i, foo())
{

}

// this is evaluated twice(once for foo().begin() and another foo().end())
iterate(i, foo())
{

}