从[5.3.3/1]开始,我发现:
sizeof运算符不应用于具有函数或不完整类型的表达式
从[3.9/5]我发现:
不完全定义的对象类型和cv void是不完整的类型
无论如何,因为sizeof不评估它的操作数,我会说这sizeof(void())是一个合法的表达式(实际上GCC编译它,结果是1).
另一方面,从这里开始,void在讨论sizeof时没有提及,既没有提到具有大小1的类型,也没有提到具有实现定义大小的类型的列表.
因此问题是:是sizeof(void())一种法律表达吗?
是否保证大小等于1?
或者这是一个导致UB的法律表达,这就是全部?
这是这个问题的后续行动.
评价和在回答据说超过一次,更多的void{}是没有一个有效的类型-ID,也不是一个有效的表达式.
这很好,它是有道理的,这就是全部.
然后我通过工作草案的[7.1.7.4.1/2](占位符类型扣除).
有人说:
[...]
- 对于使用return包含占位符类型的返回类型声明的函数中发生的非丢弃 语句,T是声明的返回类型,并且e是return语句的操作数 .如果return语句没有操作数,那么e是void{};
[...]
那么,void{}(概念上)合法与否?
如果它在工作草案中提到是可接受的(尽管只是作为- 如果它是一个 -陈述),它必须是合法的.这意味着它也decltype(void{})应该是有效的,作为一个例子.
否则,工作草案应该使用void()而不是void{}?
嗯,说实话,我很确定我没有足够的技巧来指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?上面的子弹中提到了
什么void{},以及为什么在这种情况下它是一个法律表达?
我得到了一段void()用作参数的代码.代码不编译......很明显?
我们可以实例化任何类型的东西void吗?我相信答案是否定的,除了a void*.例如:
void askVoid(void param) {}错误:参数可能没有
void类型
void askNaught() {}并使用askNaught(void())`错误调用它:错误C2660 ::
takeNaught函数不带1个参数
template <typename T> void takeGeneric(T param) {}并调用它有takeGeneric(void())错误:错误C2893:无法专门化功能模板
void takeGeneric(T)
void voidType错误:不允许使用不完整的类型
auto autoVoid = void()错误:不能推断出
auto类型
void* voidPtr工作正常,但remove_pointer_t<decltype(voidPtr)> decltypeVoid错误:错误C2182 ::
decltypeVoid非法使用类型void
就是这样,对吧?void()C++中没有地方可供选择吗?这只是我给出的错误代码,对吧?
这个问题的灵感来自Is sizeof(void())一个法律表达?但有一个重要的区别,如下所述.
有问题的表达是:
sizeof( int() )
Run Code Online (Sandbox Code Playgroud)
在C++语法中出现:
一元表达式:
sizeof一元表达式sizeof (类型ID)
但是,( int() )可以使用不同的含义来匹配这两种情况:
intprvalue,用多余的括号括起来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() )一个法律表达吗?",特别是关于上述两个项目符号案例匹配时语法匹配如何工作的细节.
我发现在void();三元运算符的“else”分支中被用作“什么都不做”,作为空指针检查的简写
Run Code Online (Sandbox Code Playgroud)if(var){ var->member(); }
作为
var ? var->member() : void();
但我似乎找不到对以void这种方式使用的关键字的任何引用,这是对void关键字本身的函数调用还是函子调用?或者它对 的类型没有任何影响void?或者这只是类似的 C++ 语法pass?
编辑:的返回类型member()就是void在这种情况下。
这个程序如何编译好?
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) 您不能声明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)