使用C++11标准的哪些规则来确定({..})中表达式的类型
What rules of C++11 standard are used to determine the type of the expression in ({ ... })
我不明白编译器在这里做什么,也不明白为什么它使用c++代码
#include <cstdio>
int main()
{
printf( ({ // (1)
struct some_noize_struct {
// there may be another code
};
42;
"abc";
}) // (2)
);
return 0;
}
(1(和(2(大括号之间的表达式类型为const char*。经过一些实验,我发现了由最后一部分确定的(1(-(2(-表达类型。
这是一个示例代码。它适用于c++11及更高版本。http://cpp.sh/5tb47
我的问题是:它是如何运作的。
正如@HolyBlackCat所解释的,您列出的代码使用了对C++(和C(的GCC编译器扩展,同时允许将复合语句用作表达式。
在printf()
语句中,需要提供const char*
或const char* &
表达式作为函数的第一个参数,例如printf("hello")
或printf(getenv("PATH"))
。扩展允许使用块中的最后一条语句将卷曲支撑块解释为这样的表达式。在您的情况下,块是:
{
struct some_noize_struct { 42 };
42;
"abc";
}
它有3个语句。最后一条语句是整个表达式的值,这意味着printf()
看到的内容与键入printf("abc")
时看到的内容基本相同。
这种代码不是标准的C++(C++11或任何其他版本(,也不是标准的C.
我建议你编写"C++Shell"网站的维护人员,让他们显示他们使用的确切编译命令行,和/或确保他们使用--std=c++11
编译C++11代码——看起来他们没有这样做。
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 表达式必须具有类类型 vs.
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 带有数组类型表达式的错误分配
- 表示函数参数的元组的类型表达式
- 如何确定撤销类型表达式的更大类型
- c++ 11中有新的函数类型表达式格式吗?