|
《C++ TMP》第四章提到boost::mpl::if_等元函数可以实现缓式评估(lazy evaluation),boost::mpl::or_等则具有短路行为(short-circuit behavior),但是我在g++编译器下试了一下,好象都不行。
测试lazy evaluation的代码如下:
#include <iostream>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_scalar.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/identity.hpp>
namespace mpl = boost::mpl;
template <typename T>
struct test_lazy_evaluation
: mpl::if_< typename boost::is_scalar<T>::type
, mpl::identity<T&>, typename boost::add_reference<T const> >::type
{
};
int main()
{
typedef test_lazy_evaluation<int&>::type t1;
std::cout << boost::is_same<t1, int&>::value << std::endl;
return 0;
}
测试short-circuit behavior的代码如下:
#include <iostream>
#include <boost/mpl/or.hpp>
#include <boost/type_traits/is_reference.hpp>
namespace mpl = boost::mpl;
template <typename T>
struct ShortCircuitTest
: mpl::or_<boost::is_reference<T>, boost::is_reference<T&> >
{
};
int main()
{
std::cout << ShortCircuitTest<int&>::type::value << std::endl;
return 0;
}
这两段代码都无法通过g++的编译,所报错误是一样的,mpl::if_<>和mpl::or_<>中本无需实例化的那部分也被实例化了,而该实例化会导致reference to reference的错误。 |
|