为什么boost::call_traits<;T>;::参数类型枚举类型的引用? 基本C++ 03枚举类型只是一个具有奇特名称的整数值,因此我希望通过值传递……/P>

为什么boost::call_traits<;T>;::参数类型枚举类型的引用? 基本C++ 03枚举类型只是一个具有奇特名称的整数值,因此我希望通过值传递……/P>,c++,templates,boost,C++,Templates,Boost,出于这个原因,我还希望boost::call_traits::param_type与T=SomeEnum一起确定传递T的最有效方式是通过值 从boost文档中,请参见: 定义一个类型,该类型表示将T类型的参数传递给函数的“最佳”方式 当我将boost::call_traits::param_type与T=SomeEnum一起使用时,它确定SomeEnum应该通过引用传递 我还希望C++11类枚举也通过值传递 测试代码: #include <string> #include <t

出于这个原因,我还希望
boost::call_traits::param_type
T=SomeEnum
一起确定传递
T
的最有效方式是通过值

从boost文档中,请参见:

定义一个类型,该类型表示将T类型的参数传递给函数的“最佳”方式

当我将
boost::call_traits::param_type
T=SomeEnum
一起使用时,它确定SomeEnum应该通过引用传递

我还希望
C++11类枚举
也通过值传递

测试代码:

#include <string>
#include <typeinfo>
#include <boost/call_traits.hpp>
#include <boost/type_traits/is_reference.hpp>

enum SomeEnum
{
    EN1_ZERO = 0,
    EN1_ONE,
    EN1_TWO,
    EN1_THREE
};

struct SomeStruct
{};

template<typename T>
void DisplayCallTraits( const std::string& desc )
{
    typedef typename boost::call_traits<T>::param_type param_type;
    std::cout << "-----------------------------------------------------\n";
    std::cout << "Call traits for: " << desc << "\n";
    std::cout << "\ttypeof T : " << typeid(T).name() << "\n";
    std::cout << "\ttypeof param_type : " << typeid(param_type).name() << "\n";
    std::cout << "\tis_reference<param_type> : " << std::boolalpha 
              << boost::is_reference<param_type>::value << "\n";
}

int main( int, char** )
{
    DisplayCallTraits< unsigned >( "unsigned" );     // pass by value, as expected
    DisplayCallTraits< SomeStruct >( "struct" );     // pass by reference, as expected
    DisplayCallTraits< SomeEnum >( "enumeration" );  // pass by reference - why?

    return 0;
}
#包括
#包括
#包括
#包括
枚举某物枚举
{
EN1_零=0,
第一,
EN1_2,
EN1_三
};
结构SomeStruct
{};
模板
void DisplayCallTraits(const std::string&desc)
{
typedef typename boost::call_traits::param_type param_type;

std::cout此已更新,以在实现中包括对
is_enum
的检查。请参阅2个月前关闭的此错误报告:

我仔细查看了,得出了它所依赖的结论,这对于enum是错误的。它专门用于所有整数类型为真,而对于其他所有类型为假。我从未对ally以前考虑过这个问题,但我想模板中的
enum
s不能是
int
s,即使它们可以在函数参数中。呵呵,显然,如果它们愿意,这可以通过boost实现:所以这可能是一个故意的选择?或者只是被忽略了?@BoBTFish模板中的
enum
//int
是一个有缺陷的东西我被绊倒了,提出了这个问题……无论如何,我仍然希望
boost::call_traits
确定一个
enum
应该通过值传递,
boost::call_traits
可以始终使用
boost::is_enum
以及
is_integral
@BoBTFish我想它必须在最新版本(1.52)中修复我会在星期一查的。你能在答案中添加到机票的链接,这样我就可以接受了。