- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在下面的代码中,我使用了 std::remove_const
和 std::remove_reference
但在两种情况下以不同的顺序给出了不同的结果:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <type_traits>
using namespace std;
int main()
{
vector<string> ar = {"mnciitbhu"};
cout<<boolalpha;
cout<<"First case : "<<endl;
for(const auto& x : ar)
{
// Using std::remove_const and std::remove_reference
// at the same time
typedef typename std::remove_const<
typename std::remove_reference<decltype(x)>::type>::type TT;
cout<<std::is_same<std::string, TT>::value<<endl;
cout<<std::is_same<const std::string, TT>::value<<endl;
cout<<std::is_same<const std::string&, TT>::value<<endl;
}
cout<<endl;
cout<<"Second case : "<<endl;
for(const auto& x : ar)
{
// Same as above but the order of using std::remove_reference
// and std::remove_const changed
typedef typename std::remove_reference<
typename std::remove_const<decltype(x)>::type>::type TT;
cout<<std::is_same<std::string, TT>::value<<endl;
cout<<std::is_same<const std::string, TT>::value<<endl;
cout<<std::is_same<const std::string&, TT>::value<<endl;
}
return 0;
}
输出是:
First case :
true
false
false
Second case :
false
true
false
我的问题是为什么以不同的顺序使用 std::remove_const
和 std::remove_reference
会产生不同的结果?由于我同时删除了引用和 const
-ness,结果不应该相同吗?
最佳答案
remove_const
只会删除 top-level const
限定符,如果存在的话。在 const std::string&
中,const
不是顶级的,因此应用 remove_const
对其没有影响。
当您颠倒顺序并首先应用 remove_reference
时,结果类型为 const string
;现在 const
是顶级的,remove_const
的后续应用将删除 const
限定符。
关于c++ - 为什么以不同的顺序使用 std::remove_reference 和 std::remove_const 会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690269/
根据文档(https://en.cppreference.com/w/cpp/utility/move),std::move有两种构造函数,在下面发布。 这些构造函数之间有什么区别? 最让我困惑的是,
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 4
我正在学习类型特征和类型转换(修改?),所以我遇到了 std::remove_reference .我试着这样实现它: template struct remove_reference { type
根据 this link , std::forward 不允许模板参数推导,而 std::remove_reference 正在帮助我们实现这一目标。但是,使用 remove_reference 如何
是否有 C++ 的 std::remove_reference 的等价物?在 C# 中? 我有一个 String和 String& ,而在我现在的项目中,这些应该被认为是等效的。 在 C++ 中,我会
remove_reference 定义如下: template struct remove_reference {typedef T type;}; template struct remo
我正在追踪一个我无法弄清楚的 C++ 编译器错误。我已将其简化为以下代码: #include #include template inline const T bar( T in ) {
我写了一个返回对象右值引用的简单函数。但它不能正常工作。但是如果我使用 std::move 它的工作,我看到唯一的区别是 remove_reference 还是什么?或者我对右值的转换是错误的? te
所以,我正在做功课,作为代码的一部分,我需要创建一个具有 3 个参数的函数,前两个是指针或迭代器,它们构成特定的元素 block ,第三个参数是具有一个参数的函数,并且该参数与两个指针或迭代器之间的
让我深入了解 C++14 通用 lambda: #include // g++ -std=c++14 template T incr(T v) { return v + 1; } int m
我看到了 std::remove_reference 的可能实现如下 template struct remove_reference {typedef T type;}; template
我正在查看 [VC10 的] unique_ptr,它们做了一些我不明白的事情: typedef typename tr1::remove_reference::type _Dx_noref; _Dx
向上迁移这个迁移 def change remove_reference :order_items, :order, foreign_key: true end 或向下迁移此迁移 def ch
我尝试实现 std::move , 使用 std::remove_reference ,但是没有它似乎也能工作。请给我一个我的实现失败的例子,其中std::remove_reference是必要的。
根据 http://en.cppreference.com/w/cpp/utility/move std::move声明如下: template std::remove_reference::typ
在用C++做模板元编程的时候,经常遇到类似下面的情况: template S make_wrapper(T&& t) { return S(std::forward(t)); } 我知道我应该在返回
我正在试验 std::remove_reference。例如,我可以将一个元素类型提取为一个数组,但如何让 remove_reference 与 STL 容器一起使用?例如,我想使用下面的 remov
如果我想提取 const 引用的类型(如 const double& 中的 double),我必须使用: typename std::remove_cv::type>::type 或 typename
我会更详细地描述我的情况。我正在构建一个车牌识别系统,使用 C++、OpenCV、Tesserect,但是当我编译代码时,它返回给我一堆错误的模糊引用,所以我检查了我的代码的所有行。我在这个小组中搜索
在下面的代码中,我使用了 std::remove_const 和 std::remove_reference 但在两种情况下以不同的顺序给出了不同的结果: #include #include #i
我是一名优秀的程序员,十分优秀!