从[5.3.3/1]开始,我发现:
sizeof运算符不应用于具有函数或不完整类型的表达式
从[3.9/5]我发现:
不完全定义的对象类型和cv void是不完整的类型
无论如何,因为sizeof不评估它的操作数,我会说这sizeof(void())是一个合法的表达式(实际上GCC编译它,结果是1).
另一方面,从这里开始,void在讨论sizeof时没有提及,既没有提到具有大小1的类型,也没有提到具有实现定义大小的类型的列表.
因此问题是:是sizeof(void())一种法律表达吗?
是否保证大小等于1?
或者这是一个导致UB的法律表达,这就是全部?
显然,这个三元表达式void()作为一个参数编译:
void foo() {}
//...
a == b ? foo() : void();
Run Code Online (Sandbox Code Playgroud)
标准是void()一个有效的表达式,还是只是一个编译器的东西?如果它是有效的,那么它是一种什么样的表达方式?
这是问题的一个后续:什么是void()中decltype(void())意味着什么?.
decltype(void())编译好,void()在这种情况下的手段在上述问题中解释(实际上在答案中).
另一方面,我注意到decltype(void{})没有编译.
它们之间有什么区别(decltype至少在上下文中)?
为什么第二个表达式不能编译?
为了完整起见,它遵循一个最小的(不是)工作示例:
int main() {
// this doesn't compile
//decltype(void{}) *ptr = nullptr;
// this compiles fine
decltype(void()) *ptr = nullptr;
(void)ptr;
}
Run Code Online (Sandbox Code Playgroud) 我有一小段代码有一个声明 void();
int main()
{
void( ); // 1: parses fine in GCC 5.4.0 -Wpedantic
// void; // 2: error declaration does not declare anything
}
Run Code Online (Sandbox Code Playgroud)
什么是1 void()?
是什么让1 void()与2不同void;?
我已经读过了:
但我很好奇松散的声明是否为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) 阅读 cppreference 对函数式风格转换的描述,我偶然发现了以下解释void():
如果 target-type 是(可能是 cv 限定的)void,则表达式是没有结果对象的 void 纯右值 (C++17 起)
现在我明白我可以void()像这样创建纯右值,但是我可以用它做什么以及为什么这可能?