gpt4 book ai didi

c++ - 带有 const 引用的 std::remove_const

转载 作者:IT老高 更新时间:2023-10-28 22:14:15 25 4
gpt4 key购买 nike

为什么 std::remove_const 不能将 const T& 转换为 T&?这个公认的相当人为的例子证明了我的问题:

#include <type_traits>

int main()
{
int a = 42;
std::remove_const<const int&>::type b(a);

// This assertion fails
static_assert(
!std::is_same<decltype(b), const int&>::value,
"Why did remove_const not remove const?"
);

return 0;
}

上面的情况很容易解决,所以对于上下文,想象一下:

#include <iostream>

template <typename T>
struct Selector
{
constexpr static const char* value = "default";
};

template <typename T>
struct Selector<T&>
{
constexpr static const char* value = "reference";
};

template <typename T>
struct Selector<const T&>
{
constexpr static const char* value = "constref";
};

int main()
{
std::cout
<< Selector<typename std::remove_const<const int&>::type>::value
<< std::endl;

return 0;
}

在上面的示例中,我希望显示 reference,而不是 constref

最佳答案

std::remove_const删除顶层 const -资格。在 const T& ,相当于 T const& , 限定条件不是顶级的:事实上,它并不适用于引用本身(那将毫无意义,因为引用在定义上是不可变的),而是适用于被引用的类型。

C++11 标准第 20.9.7.1 段中的表 52 规定,关于 std::remove_const :

The member typedef type shall name the same type as T except thatany top-level const-qualifier has been removed.[ Example: remove_const<const volatile int>::type evaluates tovolatile int, whereas remove_const<const int*>::type evaluatesto const int*. — end example ]

为了剥离const离开,你首先要申请std::remove_reference , 然后申请 std::remove_const ,然后(如果需要)应用 std::add_lvalue_reference (或任何适合您的情况)。

注意: 作为 Xeo评论中提到,可以考虑using an alias template such as Unqualified 执行前两个步骤,即剥离引用,然后剥离 const - (和 volatile- )资格。

关于c++ - 带有 const 引用的 std::remove_const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com