逗号运算符对齐
Comma Operator in alignas
此代码在 Visual Studio 2019
上编译并 运行 正常(输出 5)
#include <iostream>
int main(void) {
alignas(2,3,9,8) int x=5;
std::cout << x;
return 0;
}
in C comma expressions are explicitly disallowed in alignas. This compiled fine here. I changed the order and placed 9 or 3 at the end (which is disallowed in alignas) 并且程序编译失败表明括号中的表达式确实被解析为逗号运算符。这里有不同的含义还是这只是 VS 允许程序员摆脱他们不应该做的事情。
alignment-specifier 需要包含 type-id 或 constant-expression ([dcl.attr]):
alignment-specifier:
alignas ( type-id ...opt )
alignas ( constant-expression ...opt )
并且 constant-expression 必须是 conditional-expression ([expr.const]):
constant-expression:
conditional-expression
2,3,9,8
既不是 type-id (显然)也不是 constant-expression (因为逗号的优先级较低比条件运算符 ?:
).
因此,alignas(2,3,9,8)
是语法错误,应由符合标准的编译器诊断。
此代码在 Visual Studio 2019
上编译并 运行 正常(输出 5)#include <iostream>
int main(void) {
alignas(2,3,9,8) int x=5;
std::cout << x;
return 0;
}
in C comma expressions are explicitly disallowed in alignas. This compiled fine here. I changed the order and placed 9 or 3 at the end (which is disallowed in alignas) 并且程序编译失败表明括号中的表达式确实被解析为逗号运算符。这里有不同的含义还是这只是 VS 允许程序员摆脱他们不应该做的事情。
alignment-specifier 需要包含 type-id 或 constant-expression ([dcl.attr]):
alignment-specifier: alignas ( type-id ...opt ) alignas ( constant-expression ...opt )
并且 constant-expression 必须是 conditional-expression ([expr.const]):
constant-expression: conditional-expression
2,3,9,8
既不是 type-id (显然)也不是 constant-expression (因为逗号的优先级较低比条件运算符 ?:
).
因此,alignas(2,3,9,8)
是语法错误,应由符合标准的编译器诊断。