boost :: call_traits - 为什么gcc为此假设?

时间:2012-06-05 21:07:11

标签: c++ gcc boost c++11

示例:

#include <iostream>
#include <boost/call_traits.hpp>
#include <type_traits>

boost::call_traits<int>::param_type f()
{
        return 1;
}

int main()
{
        std::cout << std::boolalpha;
        std::cout <<
        std::is_const<boost::call_traits<int>::param_type>::value
        << std::endl; // true
        std::cout << std::is_const<decltype(f())>::value << std::endl; // false

}

问题:

除非我做错了,否则我认为两者都应该true,但gcc 4.7.0会为后者输出false。有什么我想念的吗?

1 个答案:

答案 0 :(得分:8)

非类型rvalue永远不是const限定的。只有类型rvalues可以是const限定的。

因此,即使函数f被声明为返回const int,即使函数f的类型为const int(),调用表达式{{ 1}}是类型(非常量)f()的右值。

(在the new C++11 expression category taxonomy中,调用表达式int是类型f() prvalue 。同样的规则适用:C ++11§3.10/ 4声明“非类prvalues总是有cv不合格的类型。”)