我知道struct是一个类,但代码说不是 我试图说服一个朋友,StReTt只是现代C++中的一个类。经过大量的争论和资源交换,包括一些问答,我想出了一个想法,通过代码来证明这一点,因此我写道: class A {}; struct B {}; int main() { cout << (is_class<A>::value ? "Yes" : "No") << "\n"; // output Yes cout << (is_class<B>::value ? "Yes" : "No") << "\n"; // output Yes cout << (is_same<A,B>::value ? "Yes" : "No") << "\n"; // output No ??? }

我知道struct是一个类,但代码说不是 我试图说服一个朋友,StReTt只是现代C++中的一个类。经过大量的争论和资源交换,包括一些问答,我想出了一个想法,通过代码来证明这一点,因此我写道: class A {}; struct B {}; int main() { cout << (is_class<A>::value ? "Yes" : "No") << "\n"; // output Yes cout << (is_class<B>::value ? "Yes" : "No") << "\n"; // output Yes cout << (is_same<A,B>::value ? "Yes" : "No") << "\n"; // output No ??? },c++,class,struct,types,typetraits,C++,Class,Struct,Types,Typetraits,正如您所看到的,我对第三个cout行的输出感到惊讶。所以,我现在被困在这里,我不知道我是否正确 结构是否是类? 为什么代码显示了两种不同的东西 更新: 我非常理解struct和class之间的区别。让我困惑的是课堂和答案之间的差异。如果不在这里问我该怎么办??? 这个网站是做什么的?为什么有些用户倾向于声称问题没有用处,甚至不发表评论来说明哪里不符合提问策略 记住,我们不是所有人都能流利地说英语。并不是所有人都有多年的经验 感谢所有回答或评论的人。您对std::is_same的用途感到困惑 发件

正如您所看到的,我对第三个cout行的输出感到惊讶。所以,我现在被困在这里,我不知道我是否正确

结构是否是类? 为什么代码显示了两种不同的东西

更新:

我非常理解struct和class之间的区别。让我困惑的是课堂和答案之间的差异。如果不在这里问我该怎么办??? 这个网站是做什么的?为什么有些用户倾向于声称问题没有用处,甚至不发表评论来说明哪里不符合提问策略

记住,我们不是所有人都能流利地说英语。并不是所有人都有多年的经验


感谢所有回答或评论的人。

您对std::is_same的用途感到困惑

发件人:

如果T和U使用相同的常量volatile命名相同的类型 限定条件,提供等于true的成员常量值。 否则,该值为false

显然A和B是不同的等级;用最后一句话,我暗示你确实是正确的,结构和类是一样的;不同之处在于,结构的成员的默认访问权限为public,而类的默认访问权限为private

不接受我的话,C++标准在下面的1.1.7.3中详细阐述了类型说明符[DCL,类型:ELAB]:

[…]类或结构类键应用于引用 使用类或结构类键声明的类


参考资料:

您对std::is_same的用途感到困惑

发件人:

如果T和U使用相同的常量volatile命名相同的类型 限定条件,提供等于true的成员常量值。 否则,该值为false

显然A和B是不同的等级;用最后一句话,我暗示你确实是正确的,结构和类是一样的;不同之处在于,结构的成员的默认访问权限为public,而类的默认访问权限为private

不接受我的话,C++标准在下面的1.1.7.3中详细阐述了类型说明符[DCL,类型:ELAB]:

[…]类或结构类键应用于引用 使用类或结构类键声明的类

参考资料:

首先,你是对的。结构只是一个隐藏的类

一些迹象:

1-您可以向前声明其中一个,然后用另一个定义它,尽管某些编译器可能会发出警告

class A;     // declaration of A with class
struct A { /* definition of A with struct */ } ;
2-is_类对这两个类都返回true。 3-中没有is_结构。 4-在大多数情况下,这两个关键字可以互换。e、 g:在作用域枚举中

但是,它们有重要的句法差异:

结构

默认情况下授予其成员的公共访问权限。 向后兼容C如果没有C++特征使用。 阶级

默认情况下,授予其成员的私人访问权限。 与C不兼容。 使用哪一个是惯例和/或方便的问题

通常,我更喜欢使用struct作为数据记录的聚合。以及其他用途

现在我们来回答你的第二个问题:

为什么代码显示了两种不同的东西

事实并非如此

因为is_类不是关于类型的,而是关于类型类别的。i、 e.is_类检查类型x是否为类,而is_相同是关于类型本身,即is_相同检查类型x是否与类型y相同

如果您将测试代码中的struct更改为class,is_same仍然会输出“No”,因为A是一种类型,B是另一种类型,即使它们都具有相同的类型类别,即class

根据您的代码:

A a;  // a is of type A
B b; // b is of type B
// Can we say that a and b of the same type?
// No. And this is what is_same<> checks.
起初,你是对的。结构只是一个隐藏的类

一些迹象:

1-您可以向前声明其中一个,然后用另一个定义它,尽管某些编译器可能会发出警告

class A;     // declaration of A with class
struct A { /* definition of A with struct */ } ;
2-is_类对这两个类都返回true。 3-中没有is_结构。 4-在大多数情况下,这两个关键字可以互换。e、 g:在作用域枚举中

但是,它们有重要的句法差异:

结构

默认情况下授予其成员的公共访问权限。 向后兼容C如果没有C++特征使用。 阶级

默认情况下,授予其成员的私人访问权限。 与C不兼容。 使用哪一个是惯例和/或方便的问题

通常,我更喜欢使用struct作为数据记录的聚合。以及其他用途

现在我们来回答你的第二个问题:

为什么代码显示了两种不同的东西

事实并非如此

贝卡 use is_类不是关于类型的,而是关于类型类别的。i、 e.is_类检查类型x是否为类,而is_相同是关于类型本身,即is_相同检查类型x是否与类型y相同

如果您将测试代码中的struct更改为class,is_same仍然会输出“No”,因为A是一种类型,B是另一种类型,即使它们都具有相同的类型类别,即class

根据您的代码:

A a;  // a is of type A
B b; // b is of type B
// Can we say that a and b of the same type?
// No. And this is what is_same<> checks.

这与结构与类无关

是的,因为B也是一个班级

不,因为他们不是同一个班

A和B是两种不同的类型


它是std::相同,而不是std::相似。

这与结构与类无关

是的,因为B也是一个班级

不,因为他们不是同一个班

A和B是两种不同的类型


它是std::is_same,而不是std::is_simple。

现在尝试使用类B{};。一门课不是一门课吗?有用的阅读:这对诊断并没有真正的帮助。公民,你不清楚这些信息。一些用户似乎把大部分时间都花在寻找问题来否决投票。你的问题对我来说似乎很合理。现在试试B类{};。一门课不是一门课吗?有用的阅读:这对诊断并没有真正的帮助。公民,你不清楚这些信息。一些用户似乎把大部分时间都花在寻找问题来否决投票。你的问题对我来说似乎很合理。感谢@juanchopanza对默认构造函数/析构函数的更正。我更正了我的答案。方便的链接:感谢@juanchopanza对默认构造函数/析构函数的更正。我更正了我的答案。方便的链接:谢谢@BoundaryImposition,谢谢你的精彩帖子。我检查过了,真的很好。所以,如果我需要检查这样一个东西,我可以使用这样的东西:if is_classA&&is_classB。。。我寻找的是相似的,但它不在那里。所以我想你提到它是为了清楚。但是如果我需要这样的功能呢?@KamalZidan:是的。是的,std::is_simple不存在;据我所知,没有办法也没有理由实施它。谢谢@BoundaryImposition为您提供的精彩帖子。我检查过了,真的很好。所以,如果我需要检查这样一个东西,我可以使用这样的东西:if is_classA&&is_classB。。。我寻找的是相似的,但它不在那里。所以我想你提到它是为了清楚。但是如果我需要这样的功能呢?@KamalZidan:是的。是的,std::is_simple不存在;据我所知,没有办法也没有理由实施它。
cout << (is_same<A,B>::value ? "Yes" : "No") << "\n"; // output No ???