相关疑难解决方法(0)

sizeof(void())是一个合法的表达式吗?

[5.3.3/1]开始,我发现:

sizeof运算符不应用于具有函数或不完整类型的表达式

[3.9/5]我发现:

不完全定义的对象类型和cv void是不完整的类型

无论如何,因为sizeof不评估它的操作数,我会说这sizeof(void())是一个合法的表达式(实际上GCC编译它,结果是1).
另一方面,从这里开始,void在讨论sizeof时没有提及,既没有提到具有大小1的类型,也没有提到具有实现定义大小的类型的列表.

因此问题是:是sizeof(void())一种法律表达吗?
是否保证大小等于1?
或者这是一个导致UB的法律表达,这就是全部?

c++ sizeof void language-lawyer

50
推荐指数
4
解决办法
3754
查看次数

无效{}是否合法?

这是这个问题的后续行动.
评价和在回答据说超过一次,更多的void{}没有一个有效的类型-ID,也不是一个有效的表达式.

这很好,它是有道理的,这就是全部.

然后我通过工作草案的[7.1.7.4.1/2](占位符类型扣除).
有人说:

[...]
- 对于使用return 包含占位符类型的返回类型声明的函数中发生的非丢弃  语句,  T 是声明的返回类型,并且  e 是return语句的操作数  .如果  return 语句没有操作数,那么  e 是  void{};
[...]

那么,void{}(概念上)合法与否?
如果它在工作草案中提到是可接受的(尽管只是作为- 如果它是一个 -陈述),它必须是合法的.这意味着它也decltype(void{})应该是有效的,作为一个例子.
否则,工作草案应该使用void()而不是void{}


嗯,说实话,我很确定我没有足够的技巧来指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?上面的子弹中提到了
什么void{},以及为什么在这种情况下它是一个法律表达?

c++ void language-lawyer return-type-deduction c++17

28
推荐指数
2
解决办法
673
查看次数

decltype(void())中的void()究竟是什么意思?

这是对这个问题的跟进,更准确地说是这个答案的评论.

什么是void()decltype(void())代表什么呢?
它表示函数类型,表达式还是其他什么?

c++ void decltype language-lawyer c++11

24
推荐指数
2
解决办法
2255
查看次数

建造一个空洞类型?

我得到了一段void()用作参数的代码.代码不编译......很明显?

我们可以实例化任何类型的东西void吗?我相信答案是否定的,除了a void*.例如:

  1. 编写函数void askVoid(void param) {}错误:

参数可能没有void类型

  1. 编写函数void askNaught() {}并使用askNaught(void())`错误调用它:

错误C2660 :: takeNaught函数不带1个参数

  1. 编写模板化函数template <typename T> void takeGeneric(T param) {}并调用它有takeGeneric(void())错误:

错误C2893:无法专门化功能模板 void takeGeneric(T)

  1. 声明void voidType错误:

不允许使用不完整的类型

  1. 声明auto autoVoid = void()错误:

不能推断出auto类型

  1. 声明void* voidPtr工作正常,但remove_pointer_t<decltype(voidPtr)> decltypeVoid错误:

错误C2182 :: decltypeVoid非法使用类型void

就是这样,对吧?void()C++中没有地方可供选择吗?这只是我给出的错误代码,对吧?

c++ void

21
推荐指数
3
解决办法
2025
查看次数

sizeof(int())是一个合法的表达式吗?

这个问题的灵感来自Is sizeof(void())一个法律表达?但有一个重要的区别,如下所述.

有问题的表达是:

sizeof( int() )
Run Code Online (Sandbox Code Playgroud)

在C++语法中出现:

一元表达式:

  • sizeof 一元表达式
  • sizeof ( 类型ID )

但是,( int() )可以使用不同的含义来匹配这两种情况:

  • 作为一元表达式,它是一个值初始化的intprvalue,用多余的括号括起来
  • 作为type-id,它是没有返回参数的函数的类型int.

在语义约束中sizeof,即C++ 14 [expr.sizeof]/1,它解释了表单sizeof( type-id )可能不适用于函数类型.

但是我不确定违反该语义约束是否意味着它sizeof( int() )是正确的并使用sizeof 一元表达形式; 或者是否有其他规则在语法匹配的早期阶段消除两个案例的歧义.

NB.对于另一个问题sizeof(void()),解释都不是有效的,因此可以认为编译器拒绝表达式是错误的,表明它与type-id形式匹配是正确的.但是,gcc拒绝sizeof( int() )了有关type-id的消息.

要明确的是,我的问题是:"这是sizeof( int() )一个法律表达吗?",特别是关于上述两个项目符号案例匹配时语法匹配如何工作的细节.

c++ grammar language-lawyer

20
推荐指数
1
解决办法
367
查看次数

什么叫 void(); 正在做?

我发现在void();三元运算符的“else”分支中被用作“什么都不做”,作为空指针检查的简写

if(var){
   var->member();
}
Run Code Online (Sandbox Code Playgroud)

作为

var ? var->member() : void();

但我似乎找不到对以void这种方式使用的关键字的任何引用,这是对void关键字本身的函数调用还是函子调用?或者它对 的类型没有任何影响void?或者这只是类似的 C++ 语法pass

编辑:的返回类型member()就是void在这种情况下。

c++ syntax void

17
推荐指数
3
解决办法
1344
查看次数

什么是"void();" 在C++中作为单独的声明意味着什么?

这个程序如何编译好?

int main() {
    void();  // Does this create a "void" object here?
}
Run Code Online (Sandbox Code Playgroud)

我已经在MSVC和GCC下进行了测试.但这void是一个不完整的类型.对任何其他不完整的用户定义类型执行相同操作时,

class Incomplete;

int main() {
    Incomplete();  // Error saying "Incomplete" is incomplete.
}
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
2
解决办法
272
查看次数

“ void()”如何有用?

您不能声明void变量:

void fn() {
    void a; // ill-formed
}
Run Code Online (Sandbox Code Playgroud)

但这编译为:

void fn() {
    void(); // a void object?
}
Run Code Online (Sandbox Code Playgroud)

什么void()意思 有什么用?为什么void a;格式不正确,但void()可以?

void fn() {
    void a = void(); // ill-formed
}
Run Code Online (Sandbox Code Playgroud)

c++ void variable-declaration

1
推荐指数
1
解决办法
201
查看次数