添加const到引用

时间:2018-05-01 22:08:31

标签: c++ templates const

我想通过typedef const A B;将const添加到引用类型。

不知怎的,它不起作用。这在c ++中是不可能的吗?

测试:

#include <type_traits>
typedef int& A;
typedef const A B;  // <-- Add const
// typedef std::add_const<A>::type B;  // also doesn't work.
static_assert(std::is_const<typename std::remove_reference<
        B>::type>::value, "is const");
int main() {
    return 0;
}

编译错误:

add2.cpp:5:1: error: static assertion failed: is const
 static_assert(std::is_const<typename std::remove_reference<
 ^~~~~~~~~~~~~

2 个答案:

答案 0 :(得分:13)

  

不知怎的,它不起作用。这在c ++中是不可能的吗?

不是你这样做的方式。 typedef与预处理器宏不同。

typedef int& A;
typedef const A B;

不会转化为

typedef int& A;
typedef const int& B;

中的const
typedef const A B;

适用于A,而不是int的{​​{1}}部分。由于引用在C ++中是不可变的,因此A与类型点视图中的const A相同。

您可以使用:

A

如果您想从typedef int const& B; 派生,可以使用:

A

如果您能够使用C ++ 14或更高版本,则可以将其简化为:

using B = typename std::remove_reference<A>::type const&;

答案 1 :(得分:0)

不幸的是,std::add_const<T> 并没有按照您的想法进行参考。 将 const 添加到引用的方法是这样的:

    using in_type = double&;

    using out_type = std::add_lvalue_reference_t<std::add_const_t<std::remove_reference_t<in_type>>>;

    static_assert( std::is_same<out_type, double const&>{} , "!");