这里有一段代码,有一些小细节,不是很明白。请教一下

2021-04-30 09:05:15 +08:00
 yazoox
// 1
struct Base
{
    int retCode {};
    std::string retErrorString;
};

// 2
template <typename Type>
struct EventResult : Base
{
    Type retValue {};
};

// 3
template <>
struct EventResult<void> : Base {};

代码段 1 中间的 int retCode 后面为什么要添加一对{},代码 2 也有类似的,Type retValue {} 代码段 2 已经定义好了模板,为什么要添加代码段 3 ?

3049 次点击
所在节点    C++
24 条回复
nicebird
2021-04-30 11:12:38 +08:00
1. {}构造
2. 和 1 一样
3. 偏特化,void 类型不要 retValue
zwy100e72
2021-04-30 11:13:24 +08:00
没有 3 的情况下你是无法使用 EventResult<void> 的,因为无法定义一个 void 类型的成员变量。参见 https://godbolt.org/z/dxn1h4h5T

有 3 的情况下,EventResult<void> 的成员变量和 Base 一致,而其他类型的 EventResult<T> 有一个单独的 retValue 成员 https://godbolt.org/z/9TWfh1TGE
lonewolfakela
2021-04-30 17:52:49 +08:00
@yazoox “为什么?模板的定义 Type retValue {}; 就是有可能是 void 啊?”
并不可能,因为变量的类型不能为 void 。
mingl0280
2021-04-30 22:47:26 +08:00
@leimao C++11 以上 POD/结构体变量初始化推荐使用{}。如果使用{0}只能初始化第一个,反而问题更大。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/774256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX