5

例子:

#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有什么我想念的吗?

4

1 回答 1

8

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

因此,即使函数f被声明为返回 a const int,并且即使函数的类型fconst int(),调用表达式f()也是类型 (non-const) 的右值int

(在新的 C++11 表达式类别分类法中,调用表达式f()是类型的纯右int值。同样的规则适用:C++11 §3.10/4 指出“非类纯右值始终具有 cv 非限定类型。”)

于 2012-06-05T21:11:35.413 回答