给引用加上 const

7

我想通过 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个回答

15

不知道为什么它不起作用。在C++中不可能实现吗?

你的方法行不通。 typedef 不像预处理器宏那样工作。

typedef int& A;
typedef const A B;

不能翻译成

typedef int& A;
typedef const int& B;

const

typedef const A B;

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


您可以使用:

typedef int const& B;

如果你想从 A 派生它,可以使用:

using B = typename std::remove_reference<A>::type const&;
如果您能使用C++14或更高版本,您可以将其简化为:
using B = std::remove_reference_t<A> const&;

5
西部联盟再次落败。 - Yakk - Adam Nevraumont
@Yakk,这是我第一次听到这个表达。谢谢。 - R Sahu

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

我再次被这个问题困扰,一年后终于找到了答案。 甚至想给它点赞 :).
这个回答更加通用和简洁,但仍不完美。
    using in_type = Ref;

    using out_type = decltype( std::as_const(std::declval<in_type>()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接