【问题标题】:BOOST_TYPEOF returns int instead of const intBOOST_TYPEOF 返回 int 而不是 const int
【发布时间】:2015-01-30 17:36:19
【问题描述】:

你能解释一下为什么会打印出1吗?不应该BOOST_TYPEOF 返回const int。如何在不使用 c++11 特性的情况下检查函数是否返回 const

#include <iostream>

#include <boost/typeof/typeof.hpp>
#include <boost/type_traits/is_same.hpp>

const int f_const_int() {return 1;}

int main()
{
    typedef BOOST_TYPEOF(f_const_int()) type;
    std::cout << (boost::is_same<type, int>::value) << std::endl;
}

【问题讨论】:

    标签: c++ boost constants typeof


    【解决方案1】:

    如果纯右值表达式的类型为 cv int,则忽略该 cv 限定符。 [表达式]/6:

    如果纯右值最初的类型为“cv T”,其中T 是 cv-unqualified 非类,非数组类型,表达式的类型 在任何进一步分析之前调整为T

    因此,宏不会收到返回类型为 const 的信息。
    可能的解决方法:

    #include <boost/type_traits/function_traits.hpp>
    
    // […]
    typedef boost::function_traits<BOOST_TYPEOF(f_const_int)>::result_type type;
    

    Demo.

    【讨论】:

    • 这里放弃 cv 资格的原因是什么?
    • @Barry 也许是因为纯右值的 cv 限定符是微不足道的。但是,如果我们不必处理它们,那么在 [expr] 中定义东西就很容易了。
    • 传递给BOOST_TYPEOF的数据是一个右值。它是未命名的,因此,无论是否为 const,如果不将其分配给左值,您就无法修改它,而左值必须声明为 const 才能使分配不抱怨。
    • @Columbo 我们可以对成员函数使用相同的解决方法吗? boost.org/doc/libs/1_57_0/libs/type_traits/doc/html/… 这里写的是不可能的。你能确认一下吗?
    • @Ashot 您不能将 function_traits 与成员函数一起使用。实际上,在 C++03 中为成员函数提供相当完整的特征会变得非常乏味,因为您需要大量的偏特化。如果可能,我强烈建议您开始使用 C++11,因为在那里一切都会变得容易得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2019-09-15
    • 2015-03-03
    • 2016-05-28
    相关资源
    最近更新 更多