2011-06-02 50 views
8

我通过"C++ Template Metaprogramming" by Abrahams & Gurtovoy工作“ 这实际上不是在第二章,但是是我尝试过,而在第一次演练工作(2.10,2.0),这是混淆了我:为什么boost :: is_same <int const&,boost :: add_const <int &> :: value等于false?

#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'。

+3

顺便说一句你可以通过设置'std :: cout << std :: boolalpha;' – juanchopanza 2011-06-02 16:51:34

回答

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 &

+0

我现在明白了。我认为add_const 会给我int const&但它会尝试添加const *另一边*,谢谢 – 2011-06-02 21:22:55

9

您不能将const添加到引用,它将是int& const这是不可能的。

就像使用typedef一样,添加q ualifiers不是文本替代品,而是适用于整个类型的东西。

+0

来避免你的'显示'函数的含义是(如果不明确)'boost :: add_const :: type '仍然只是'int&'。 – ildjarn 2011-06-02 16:43:24

+0

如正式文档的示例所示:http://www.boost.org/doc/libs/1_46_1/libs/type_traits/doc/html/boost_typetraits/reference/add_const.html – 2011-06-02 16:44:37

+0

实际上'int&const'是非法的。如果允许的话,这将是多余的,因为一个引用已经隐式地const了。 – 2011-06-02 16:53:15

相关问题