【发布时间】:2014-01-15 12:43:43
【问题描述】:
阅读以下标准段落:
[C++11: 5.3.3/6]:sizeof和sizeof...的结果是std::size_t类型的常量。 [注意:std::size_t在标准头文件<cstddef>(18.2) 中定义。 ——尾注]
现在:
[C++11: 18.2/6]:size_t类型是实现定义的无符号整数类型,其大小足以容纳任何对象的字节大小。
当然,该段落并不要求 size_t 是使用 typedef 定义的类型别名,但由于它明确声明可由标准标头 <cstddef> 提供,我认为我们可以将其视为未能包含<cstddef> 应取消任何保证size_t 可用于程序。
但是,根据第一个引用,我们无论如何都可以获得std::size_t 类型的表达式。
We can actually demonstrate both of these facts:
int main()
{
typedef decltype(sizeof(0)) my_size_t;
my_size_t x = 0; // OK
std::size_t y = 1; // error: 'size_t' is not a member of 'std'
}
std::size_t 对程序不可见,但sizeof(0) 仍然给我们一个?真的吗?
因此说5.3.3/6 是有缺陷的 是不正确的,并且它实际上具有“与std::size_t 解析为相同的类型”,但不是 std::size_t 自己?
当然,如果std::size_t 是类型别名,则两者是相同的,但同样,这实际上是不需要的。
【问题讨论】:
-
我很确定“与 std::size_t 解析为相同的类型”是
std::size_t,无论size_t是如何定义的或者它是否是任何东西的别名。也就是说,我还不足以作为 C++ 语言律师来回答这个问题。 -
“我认为我们可以理解为未能包含
应该消除任何 size_t 可用于程序的保证” - 您需要包含 cstddef才能使用size_t名称,但不是size_t类型。 -
@user2357112:
int和long是不同的类型,尽管在我的平台上具有相同的属性。 -
@LightnessRacesinOrbit 相关:
operator new、operator delete及其变体也可以在不包含任何头文件的情况下使用,但在标准中的某处(我想是 3.7.4 但不确定),我读到使用它们“不会使操作员std::operator new(std::size_t)可见”,或类似的东西。 -
@H2CO3 该类型在语言中可用,不需要库。该库为其提供了一个方便的名称,仅此而已。
标签: c++ c++11 std language-lawyer