我正在通过"C++ Template Metaprogramming" by Abrahams & Gurtovoy“ 这实际上不是第二章,而是我在第一次练习(2.10,2.0)时尝试的东西让我感到困惑:
#include <iostream>
#include <boost/type_traits.hpp>
std::string display(bool b)
{
return (b ? "true" : "false");
}
int main()
{
using namespace std;
cout << display(boost::is_same<int const&, boost::add_const<int &>::type >::value) << "\n";
return 0;
}
输出为“false”。 但是,如果我删除引用,即'int const'和'int'。输出为“true”。
答案 0 :(得分:11)
如果您使用指针尝试相同的操作,例如
boost::is_same<int const *, boost::add_const<int *>::type>::value
您发现它也是错误的,因为boost::add_const<int *>::type
生成int *const
类型,这显然与int const *
不同。
基本上与引用相同的是,boost::add_const<int &>::type
是尝试生成int &const
。形式上,类型int &const
在C ++中是非法的 - cv-qualification不能应用于引用本身。因此,boost::add_const
在这种情况下被设计为无操作,这意味着boost::add_const<int &>::type
再次生成int &
。
答案 1 :(得分:9)
您不能将const添加到引用中,它将是int& const
,这是不可能的。
就像使用typedef一样,添加限定符不是文本替换,而是适用于整个类型的东西。