- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
为什么 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
, whereasremove_const<const int*>::type
evaluatestoconst 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/
这段代码在做什么? class Object remove_const :File end 是否完全删除[1] 类?当我在那段代码之后调用 File.instance_methods 时,它只是
嗨谁能给我一个示例程序来“创建一个 ApplyRemoveConst 模板构造一个新的类型列表,并将 remove_const 应用于每个元素” 例如: typedef TYPELIST_3(A, c
为什么 std::remove_const 不能将 const T& 转换为 T&?这个公认的相当人为的例子证明了我的问题: #include int main() { int a = 42
请注意,我使用 std::thread只是为了在错误中获得可读类型: int main() { const int * first; using deref = decltype(*f
如果我使用 C 方式,我可以执行以下操作: #define NOCONST(x) std::remove_const::type const int a; NOCONST(a) b; 如果我用C++的
在下面的代码中,我使用了 std::remove_const 和 std::remove_reference 但在两种情况下以不同的顺序给出了不同的结果: #include #include #i
这个问题在这里已经有了答案: std::remove_const with const references (1 个回答) 关闭 4 年前。 #define T int int main () {
只是想让简单的http服务器运行起来,对ruby一无所知 /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.3.5/lib/rack/backports/uri/c
我是一名优秀的程序员,十分优秀!