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

Jes*_*ood 5 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

}
Run Code Online (Sandbox Code Playgroud)

题:

除非,我做错了什么,我认为我应该true为两者做好准备,但false后者的gcc 4.7.0输出.有什么我想念的吗?

Jam*_*lis 8

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

因此,即使函数f声明为返回a const int,即使函数的类型fconst int(),调用表达式f()也是类型(非常量)的右值int.

(在新的C++ 11表达式分类中,调用表达式f()是类型的prvalueint.同样的规则适用:C++11§3.10/ 4声明"非类prvalues始终具有cv非限定类型.")