代码之家  ›  专栏  ›  技术社区  ›  R zu

将常量添加到引用

  •  7
  • R zu  · 技术社区  · 6 年前

    我想通过以下方式将常量添加到引用类型 typedef const A B;

    不知怎么的,它不起作用。这在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 回复  |  直到 6 年前
        1
  •  15
  •   R Sahu    6 年前

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

    不是用你现在的方式。 typedef 与预处理器宏不同。

    typedef int& A;
    typedef const A B;
    

    不转换为

    typedef int& A;
    typedef const int& B;
    

    这个 const 在里面

    typedef const A B;
    

    适用于 A ,而不是 int 部分 A. .由于引用在C++中是不可变的, const A 与相同 A. 从类型的角度来看。


    您可以使用:

    typedef int const& B;
    

    如果你想从 A. ,您可以使用:

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

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

    using B = std::remove_reference_t<A> const&;
    
        2
  •  0
  •   alfC    3 年前

    不幸的是 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&>{} , "!");