- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++11特性小结之decltype、类内初始化、列表初始化返回值由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
作用:返回表达式或变量的类型 。
返回值规则:
decltype()不会执行括号内的表达式,decltype返回的类型是用于声明的,不能用于单纯的判断。比如decltype(a)==int,是不可以的,只能是在定义新的变量、返回值的地方使用:
1
2
|
int
a=1;
decltype(a) b (等价于
int
b)
|
若是给变量加多了1个括号,则会成为一个表达式.
1
2
3
4
|
int
a = 1;
int
b=2;
decltype((a)) d=b
// decltype((a))
返回类型
int
&。而引用必须赋初值,所以这里的d必须赋初值。
|
若表达式和指针相关的用法:
设p是指向int变量的指针 。
这里解释一下为什么1返回的是引用而不是int:因为*p返回的本质上就是一个引用,当我们向*p赋值的时候,改变的是变量原本的值,而不是做了一个拷贝,显然这是引用的性质.
泛型编程中使用decltype:
通过和尾置返回类型结合,可以使得返回值可以由编译器推断,无需程序员指出。主要用于编写转发函数 。
1
2
3
4
5
6
7
8
|
int
& foo(
int
& i);
float
foo(
float
& f);
template
<
class
T>
auto transparent_forwarder(T& t) −> decltype(foo(t))
{
return
foo(t);
}
|
像这个例子如果没有decltype,我们无法确定foo(t)到底是两个备选函数中的哪一个,因为这是在运行时决定的。这样子我们无法直接编写transparent_forwarder函数的返回值.
还有其他很多例子,decltype常用于难以确定变量类型的地方,而模板就是为了适配多类型而产生的,所以在泛型编程中,很多时候都会用到decltype来做到灵活定义变量类型.
类内初始化 。
C++11以前是不可以在一个类的数据成员声明的时候初始化的,除非是一个const的静态变量:
1
2
3
4
5
|
class
A
{
static
int
i = 1;
//correct,不得不在此赋值,因为const常量必须在声明时赋值
int
num=2;
//error,不允许在类内声明的时候对数据成员初始化
};
|
这样子带来繁琐的问题就是:尽管我们只是想为所有该类的实例的数据成员都设置一个初始值,也必须自己定义一个构造函数才能做到.
于是在c++11:允许直接在类内初始化值(前提:这个值必须是常量表达式).
顺序:类内部初始化先于构造函数初始化进行,构造函数初始化会覆盖类内部初始化。也就是说,如果我们即定义了类内初始化值,又定义了自己的构造函数,最终的结果还是按照我们的意愿,对数据成员按照构造函数赋值.
使用方法:
1
2
3
4
5
|
class
A
{
int
num=2;
//correct,C++11允许在类内声明的时候对数据成员初始化
int
a{7}
//用花括号赋值也可以,a=7
};
|
注意:C++11中,仍然没有改变静态数据成员必须在类内声明,类外初始化的事实.
1
2
3
4
5
|
class
A
{
static
int
d = 1;
//error
};
int
A::d = 1
//correct,一般来说:初始化语句会放在cpp文件,类定义放在h文件
|
列表初始化返回值 。
在C++11之前,如果我们想要返回一组数据,我们必须在子函数中构造一个对应的容器,借助容器来进行返回.
1
2
3
4
5
|
vector<
int
> process()
{
vector<
int
> v={1,2,3,4}
return
v;
}
|
在新标准下,我们可以直接返回字面值,该字面值会用于容器的构造,而无需我们自己去构造.
1
2
3
4
|
vector<
int
> process()
{
return
{1,2,3,4};
}
|
总结 。
到此这篇关于C++11特性小结之decltype、类内初始化、列表初始化返回值的文章就介绍到这了,更多相关C++11特性decltype、类内初始化、列表初始化返回值内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.im/post/5ec8d325518825431e03d81a 。
最后此篇关于C++11特性小结之decltype、类内初始化、列表初始化返回值的文章就讲到这里了,如果你想了解更多关于C++11特性小结之decltype、类内初始化、列表初始化返回值的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
由 this question 触发,我想知道是否允许这样做: template T foo(){return T{};} struct bar {}; int main() { bar a
我正在尝试以一种通用的方式实现 group_by 方法,我可能已经实现了它(除了它不适用于 C 数组),但代码对我来说仍然很难看...... 有没有更简单的方法来做我想做的事(+让它适用于所有容器和
这个问题在这里已经有了答案: What is decltype with two arguments? (2 个答案) 关闭 7 年前。 我遇到了一个decltype(),有两个参数作为模板函数的返
这是问题的后续:What does the void() in decltype(void()) mean exactly? . decltype(void()) 编译得很好,void() 在这种情况
这是我第一次使用decltype,我不太确定我是否正确使用它。该代码确实编译并且似乎适用于像 char 和 int 这样的 POD。 但是,我想知道我是否会遇到更复杂的数据类型的任何问题 - 其他人警
我一直在使用解析为与声明相同类型的定义中的推导返回类型。这有效: template struct Cls { static std::size_t f(); }; template declt
我发现它们是不同的,并且语言标准规定了每个语句应该检索什么样的类型(变量和表达式之间的差异)。但我真的很想知道为什么这两种类型应该不同? #include int x=0; decltype((x))
关于 decltype(x) 和 decltype((x)) 之间的区别,我已经读过很多遍了。一个例子如下。 x is the name of a variable, so decltype(x) i
我有一个简单的模板化包装器结构,其成员函数在其模板类型的对象上调用 .error()。 template struct Wrapper { T t; decltype(auto) f
decltype(auto) 和 decltype(returning expression) 作为函数(模板)的返回类型 if expr 有什么区别在这两种情况下都使用不带括号? auto f()
我在想 decltype((x)) 给出了 & 引用类型,但是一些实验表明还有其他事情: #include int main(){ int x = 0; decltype((x)) r
例如,简单的恒等仿函数: template class identity { public: constexpr auto operator ()(T && i) -> decltype(s
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: decltype and parenthesis 我在维基百科上找到了这个: auto c = 0;
// g++ 7.3 template struct td; int main() { int a = 1; td t1; td t2; return 0; } 编译结果如下: 错误:
这确实是一个 C++14 问题。而且它的理论性多于实践性。 有时您会零碎地构建一个函数的结果: int f( int x, int y ) { int a; //... re
我试图检测成员函数 baz() 的存在在模板参数中: template struct ImplementsBaz : public std::false_type { }; template stru
考虑以下代码:(Ideone) struct S { int a() {return 0;} decltype(a()) b() {return 1;} }; 它给了我以下错误: er
(如果您是 C++11 专业人士,请跳至粗体段落。) 假设我想编写一个模板方法,该方法调用并返回传递的对象的结果,该对象的类型是模板参数: template ReturnType doSomethin
代码 #include int main() { int a=3; int *p=&a; decltype (a) k1; decltype (*p) k2;
我是 C++ 新手。我正在尝试学习 decltype 的概念。我在网上看到这段代码。我将 decltype(s1.size()) 更改为 int,代码工作正常。 decltype(s1.size())
我是一名优秀的程序员,十分优秀!