【问题标题】:The data type produced by the sizeof operatorsizeof 操作符产生的数据类型
【发布时间】:2018-03-18 23:28:23
【问题描述】:

有人告诉我,sizeof 运算符不会产生“size_t”类型的值,而是产生与“size_t”具有相同基础类型的值。虽然这可能只是语义上的技术问题,但 C++11 5.3.3.6 和 C++14 5.3.3.6 都声明如下:

The result of sizeof and sizeof... is a constant of type std::size_t.
[ Note: std::size_t is defined in the standard header <cstddef> (18.2). —end note ]

我将此解释为,如果有办法显示 sizeof 表达式的数据类型,它应该显示“std::size_t”或“size_t”而不是“unsigned int”、“unsigned long”或任何 size_t碰巧代表那个特定的编译器,它应该显示“std::size_t”或“size_t”,即使范围内没有 size_t 的 typedef,因为编译器内部知道它是 size_t。

但是,如果我的解释不正确,而要显示的基础数据类型是正确的,那么 C++11 和 C++14 不应该这样说:

The result of sizeof and sizeof... is a constant of **the same type represented** by std::size_t.

我知道这可能是在争论针头上的天使数量,但我仍然想了解哪个在法律上是正确的。

谢谢, 雷

【问题讨论】:

  • 在您的实现中size_t 可能与unsigned long 相同,编译器知道这一点。
  • “表示”在这里不是一个好的选择。 unsigned intunsigned long 具有完全相同的表示并不罕见,但它们仍然是不同的类型。 std::size_t 只是一个名字,意思是“sizeof 返回的类型”。

标签: c++ c++11 c++14 sizeof


【解决方案1】:

std::size_t 是一个 typedef-nametype alias,它是一些其他现有类型的同义词;它不是一个独特的类型,仅用于名称查找。

因此,例如,您不能针对 size_t VS 其底层类型重载/专门化/等...

也就是说,编译器内部确实知道别名是什么,因此它可以使用它来改进其诊断等可能(或可能不会)出现在编译器生成的消息中代替/沿将其底层类型作为对程序员的帮助...

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2019-06-25
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多