C 语言中结构化类型的名称S
ist struct S
.
在C++中也可以使用struct S
作为类型名而不是S
像往常一样
struct S {};
struct S s1; // also ok in C++
S s2; // normal way in C++
所以,假设是,使用struct S
or S
因为 C++ 中的类型名是一个品味问题;-)
但下面的例子有一些地方struct S
不允许:
struct S1 {
S1(int x = 0) : x{x} {}
int x{};
};
typedef S1 S2;
template<typename T>
auto foo(T a) {
// T::_; // T is deduced to `S` in all cases
return S1{a};
// return struct S1{a}; // NOK
}
int main() {
// foo(struct S1{i}); // NOK
S1 s1;
foo(s1);
struct S1 s2{2};
foo(s2);
foo(1);
// struct S2 s20; // NOK
S2 s21;
}
谁能向我解释一下这种不对称性是什么意思?
看起来像struct S
当需要将构造函数调用作为表达式的一部分时,不允许这样做。但如果一个类型S
也可以写成struct S
使用应该也可以struct S{}
作为一名演员的电话。
Writing struct S1 s1;
在 C++ 中允许的原因之一是:与 C 的兼容性。C 允许您同时一个名为S1
, so struct S1
是一个明确的消歧义。 C++ 也允许这样做,仅用于向后兼容.
但是,在向后兼容性不适用的情况下,C++ 则不适用。例如,C 没有构造函数。
这个问题还有一个令人困惑的地方:
typedef S1 S2;
struct S2 s2;
S2
不是一个struct
name 而是别名,并且您不能为别名添加前缀struct
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)