为什么boost :: is_same <int const&,=“”boost :: add_const <int =“”&=“”> :: value equal false?</int>

时间:2011-06-02 16:39:03

标签: c++ boost metaprogramming

我正在通过"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”。

2 个答案:

答案 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一样,添加限定符不是文本替换,而是适用于整个类型的东西。