当前位置: 首页 > 知识库问答 >
问题:

为什么不能声明void类型的变量?

姚胡媚
2023-03-14

我正在标准中寻找对这一事实的正式解释。我找到了3.9.1/9所说的,并试图用该部分给出解释。

第3.9.1/9节,N3797:

void类型有一组空值。void类型是不完整的类型,无法完成。它用作不返回值的函数的返回类型。任何表达式都可以显式转换为cv void类型(5.4)。void类型的表达式只能用作表达式语句(6.2)、逗号表达式的操作数(5.18)以及?的第二个或第三个操作数:(5.16),作为typeid、noexcept或decltype的操作数,作为返回类型为void的函数的返回语句(6.6.3)中的表达式,或作为显式转换为cv void类型的操作数。

我不明白它是如何从空类型有一组空值这一事实中暗示的?

假设类型T有一组空值。为什么编译器在遇到以下行时会抛出错误:

extern T v; 

我们可以通过以下方式删除不完整类型的变量:

#include <iostream>
#include <cstring>

using namespace std;

struct Foo;

extern Foo f; //OK!

int main()
{
}

而且效果很好

演示

它不能在空类型上完成

#include <iostream>
#include <cstring>

using namespace std;

extern void f; //compile-time error

int main()
{
}

演示

共有3个答案

姜俊民
2023-03-14

[编辑]下面的答案提出了有效的意见,但它们相互矛盾。由于这些可能很有价值,我不会删除它们,但请参阅Ben Voight的回答和那里的评论以获得更直接的html" target="_blank">方法。

7.1.1/8特别允许您对extern声明进行观察:

已声明但未定义的类的名称可以在外部声明中使用。这样的声明只能以不需要完整类类型的方式使用。

void不是“已声明但未定义的类”,7.1.1中没有适用的其他例外情况。

此外,3.9/5相当明确地表示,事实上允许:

已声明但未定义的类、某些上下文中的枚举类型(7.2)或大小未知或元素类型不完整的数组是不完全定义的对象类型。[45]不完全定义的对象类型和无效类型是不完整的类型(3.9.1)。对象不应定义为具有不完整的类型。

我的。标准的这一部分非常具体地说明了定义和声明之间的差异,因此通过省略,它规定了允许声明。

史淇
2023-03-14

“void类型是不完整的类型”

不能创建任何不完整类型的变量

“…无法完成”

虽然您的extern不完整结构示例可以在稍后完成,但编译器知道任何val类型的声明都永远无法完成。

席弘图
2023-03-14

您不能声明val类型的变量,因为变量必须具有对象类型或是引用,extern uluf;不声明引用,并且val不是对象类型:

第3节[basic]

变量由非静态数据成员或对象以外的引用的声明引入。

第3.9节[basic.types]

对象类型是一种(可能是cv限定的)类型,它不是函数类型,不是引用类型,也不是void类型。

 类似资料:
  • 我的朋友们,我的项目有三节课 主类: 首先,当我在类中实例时,java使结构如下所示:structure 我的意思是,当我们在类中实例类时,java逐行读取类,例如: 因为中有3个变量,所以我们可以说,当我们实例类时,我们有5个变量。 例如,我们有字符串、int、int、int、int来表示。我的问题是为什么我们不能直接访问或或? 例如,对于initialize name,我们可以使用以下代码:,

  • 问题内容: 我试图找到为什么不能将类创建为静态类的原因?喜欢: 问题答案: 在Java中,关键字通常将一个方法或字段标记为不存在,而不是每个类实例一次,而是一次。一个类一旦存在就已经存在,因此实际上,所有类都以这种方式是“静态的”,并且所有对象都是该类的实例。 确实对 内部 类具有含义,这是完全不同的:通常,内部类实例可以访问与其绑定的外部类实例的成员,但是如果内部类为,则它没有这样的引用并且可以

  • 问题内容: 以下Java代码无法编译。 为什么?在没有先声明的情况下,没有代码路径可导致程序将1分配给该路径。 我想到的范围可能仅限于第一条陈述,但后来我不明白为什么。如果我真的不想不必要地声明以提高性能怎么办?我不喜欢声明后不使用变量。 (您可能想争论一下,我不可以在第二条语句中简单地声明b ,在这种情况下,请想象一下它可能在其他地方处于循环中。) 问题答案: 为什么?如果没有先声明,没有代码路

  • 问题内容: 为什么不能在Java中将类声明为静态类? 问题答案: 只有嵌套的类可以是静态的。这样,你可以使用嵌套类而无需外部类的实例。

  • 问题内容: 我读到要使一个类在Java中不可变,我们应该执行以下操作: Do not provide any setters Mark all fields as private Make the class final标记为私有 为什么需要步骤3?我为什么要上课呢? 问题答案: 如果你不标记该类,那么我可能会突然使你看似不变的类真正变得可变。例如,考虑以下代码: 现在,假设我执行以下操作: 注意

  • 问题内容: 为什么我们不能对Java类的方法内部声明的变量使用访问说明符? 问题答案: 因为这没有意义。方法中声明的变量是该方法的局部变量。即它们不能在方法之外访问。修改变量的声明将实现什么?