使用“struct S”或“S”作为类型名的区别

2023-11-29

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不是一个structname 而是别名,并且您不能为别名添加前缀struct.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“struct S”或“S”作为类型名的区别 的相关文章

随机推荐