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_class和is_same答案.如果不在这里问我该怎么办?这个网站是为了什么?为什么有些用户倾向于提出问题是没有用的,甚至没有评论来指明它不符合要求政策?
请记住,我们并非所有人都会说流利的英语.并非所有人都有多年的经验.
感谢所有回答或评论的人.
起初,你是对的. 结构只是一个引擎盖下的类.
一些迹象:
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
class
使用哪一个是常规和/或方便的问题.
通常,我更喜欢使用struct数据(记录)的汇总.并class用于其他用途.
现在我们来讨论你的第二个问题:
为什么代码显示两个不同的东西?
它不是.
因为is_class<>不是关于类型而是关于类型类别.(即is_class<x>检查类型x是否为类),而is_same<>关于类型本身((即is_same<x, y>检查类型x是否与类型y相同))
如果struct将测试代码更改为class,则is_same<>仍会输出"否",因为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.
Run Code Online (Sandbox Code Playgroud)
你对这是什么感到困惑std::is_same<>.
来自http://en.cppreference.com/w/cpp/types/is_same:
如果T和U使用相同的const-volatile限定名称相同的类型,则提供成员常量值等于true.否则值为false.
清楚A和B是不同的类别; 在最后一句话中,我暗示你确实是正确的,因为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