我知道struct是一个类,但代码说不

Kam*_*dan 1 c++ struct types class type-traits

我试图说服一个朋友,这struct只是class现代C++中的一个.经过大量的争论和资源交换(包括一些SO Q&A)后,我想出了一个通过代码证明它的想法,所以我写道:

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 ???
}
Run Code Online (Sandbox Code Playgroud)

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

struct一个class或不?
为什么代码显示两个不同的东西?

更新:

我很清楚struct和class之间有什么区别.令我感到困惑的是答案之间的区别is_classis_same答案.如果不在这里问我该怎么办?这个网站是为了什么?为什么有些用户倾向于提出问题是没有用的,甚至没有评论来指明它不符合要求政策?

请记住,我们并非所有人都会说流利的英语.并非所有人都有多年的经验.

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

Sha*_*adi 9

起初,你是对的. 结构只是一个引擎盖下的.

一些迹象:

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

class A;     // declaration of A with class
struct A { /* definition of A with struct */ } ;
Run Code Online (Sandbox Code Playgroud)

2- is_class<>对两者都返回true.
3-没有is_struct<><type_traits>.
4-在大多数情况下,这两个关键字是可互换的.(例如:在scoped enum中).

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

struct

  • 默认情况下授予其成员的公共访问权限.
  • 如果在没有C++功能的情况下使用,则向后兼容C

class

  • 默认情况下授予其成员私人访问权限.
  • 与C不兼容

使用哪一个是常规和/或方便的问题.

通常,我更喜欢使用struct数据(记录)的汇总.并class用于其他用途.

现在我们来讨论你的第二个问题:

为什么代码显示两个不同的东西?

它不是.

因为is_class<>不是关于类型而是关于类型类别.(即is_class<x>检查类型x是否为类),而is_same<>关于类型本身((即is_same<x, y>检查类型x是否与类型y相同))

如果struct将测试代码更改为class,则is_same<>仍会输出"否",因为AB是一种类型,即使它们都具有相同的类型类别,也是另一种类型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.
Run Code Online (Sandbox Code Playgroud)


use*_*177 7

你对这是什么感到困惑std::is_same<>.

来自http://en.cppreference.com/w/cpp/types/is_same:

如果T和U使用相同的const-volatile限定名称相同的类型,则提供成员常量值等于true.否则值为false.

清楚AB是不同的类别; 在最后一句话中,我暗示你确实是正确的,因为a struct与a相同class; 区别在于a 对其成员struct具有默认访问权限public,而a class具有默认值private.

不要相信我的话,C++标准在10.1.7.3 Elaborated类型说明符[dcl.type.elab]中声明了以下内容:

[...] class或struct class-key应该用于引用使用class或struct class-key声明的类.

参考:http://eel.is/c++draft/dcl.type.elab