相关疑难解决方法(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() 是有效的 C++ 表达式吗?

显然,这个三元表达式void()作为一个参数编译:

void foo() {}

//...
a == b ? foo() : void();
Run Code Online (Sandbox Code Playgroud)

标准是void()一个有效的表达式,还是只是一个编译器的东西?如果它是有效的,那么它是一种什么样的表达方式?

c++ expression void

17
推荐指数
2
解决办法
1213
查看次数

decltype(void())和decltype(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)

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

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

是一个声明void(); 合法的,实际上是什么?

我有一小段代码有一个声明 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;

我已经读过了:

  1. sizeof(void())是一个合法的表达式吗?但是void()被认为是sizeof中的一个类型
  2. decltype(void())中的void()究竟是什么意思?在declspec中考虑它.
  3. 我读的是无效{}合法与否?

但我很好奇松散的声明是否为void(); 不同于其中之一(当然为什么)

c++ language-lawyer

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

“ 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
查看次数

什么是 void() 纯右值以及如何使用它?

阅读 cppreference 对函数式风格转换的描述,我偶然发现了以下解释void()

如果 target-type 是(可能是 cv 限定的)void,则表达式是没有结果对象的 void 纯右值 (C++17 起)

现在我明白我可以void()像这样创建纯右值,但是我可以用它做什么以及为什么这可能?

c++ casting void

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