0

boost::mpl::or_以下のコードは、との短絡動作をテストしようとしますboost::mpl::and_

#include <vector>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/and.hpp>
#include <boost/type_traits/is_scalar.hpp>

// Dummy is forward declared and never defined
template <class T> class dummy;

// If T is a scalar evaluates to T without trying to compute the result of 
// boost::mpl::is_scalar< dummy<T>, otherwise it fails at compile time.
template <class T> 
class testOr 
: public boost::mpl::eval_if< 
    boost::mpl::or_< boost::is_scalar<T>, boost::is_scalar< dummy<T> > >,
    boost::mpl::identity<T>,
    dummy<T>        
>
{};

// If T is not a scalar evaluates to T without trying to compute the result of 
// boost::mpl::is_scalar< dummy<T>, otherwise it should fail at compile time.
template <class T> 
class testAnd
: public boost::mpl::eval_if< 
    // It appears that is_scalar< dummy<T> > is not instantiated and the operation
    // evaluates to false
    boost::mpl::and_< boost::is_scalar<T>, boost::is_scalar< dummy<T> > >,
    dummy<T>,
    boost::mpl::identity<T>
>
{};

int main() {    

  static_assert(boost::is_same< testOr< double >::type, double>::type::value,"Fails at compile time");
  // The following line causes failures at compile time due to incomplete type definition
  //static_assert(boost::is_same< testOr< std::vector<double> >::type, double>::type::value,"Fails at compile time");

  static_assert(boost::is_same< testAnd< std::vector<double> >::type, std::vector<double> >::type::value,"Fails at compile time");
  // The following should cause failure at compile time due to incomplete type definition, but works instead!
  static_assert(boost::is_same< testAnd< double >::type , double >::type::value,"Fails at compile time");

return 0;
}

型定義が不完全なため、このコードはコンパイル時に失敗すると予想されますが、実際には機能します。

>icpc --version
icpc (ICC) 12.1.3 20120212
Copyright (C) 1985-2012 Intel Corporation.  All rights reserved.

>icpc -gcc-name=gcc-4.5 -std=c++0x -o ex-4.0.x ex-4.0.cc

だから、私が理解したいポイントは次のとおりです。

方法に矛盾があり、それらの引数boost::mpl::or_boost::mpl::and_評価していますか、それとも、キャッチできないコードにエラーがある可能性がありますか?

4

2 に答える 2

2

あなたの考えに論理的な誤りがあります-最初の引数がに評価された場合||、短絡します。は、2番目の引数を評価する必要があることを意味します。対照的に、最初の引数がである場合は短絡します。これは上記の場合です。trueis_scalar<std::vector<double>>false&&false

于 2012-09-14T14:35:57.340 に答える
2

の 2 番目の引数が評価されないのはなぜだと思いますor_か? is_scalar未定義の型で使用できます。

たとえば、この場合、エラーも発生します。

// If T is not a scalar evaluates to T without trying to compute the result of 
// boost::mpl::is_scalar< dummy<T>, otherwise it should fail at compile time.
template <class T> 
class testAnd
: public boost::mpl::eval_if< 
    // It appears that is_scalar< dummy<T> > is not instantiated and the operation
    // evaluates to false
    boost::mpl::and_< boost::is_scalar<T>, boost::is_scalar< dummy<T> > >,
    boost::mpl::identity<T>,
    dummy<T>
>
{};

以来boost::is_scalar<T>、真ですがboost::is_scalar<dummy<T>>、あなたの場合は偽です。

見て。http://liveworkspace.org/code/a792e18ca16a0410a67a6eee8c550bd9

于 2012-09-14T14:22:16.820 に答える