示例:
#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
。有什么我想念的吗?
答案 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不合格的类型。”)