我预计以下代码会被拒绝,因为 C++23 中不允许使用零大小的数组。然而Clang似乎对此没有任何问题,并且明目张胆地接受了。
template<typename T>
concept c = requires { T{}; };
static_assert(c<int[]>); // clang ok, gcc nope, msvc nope
我知道一些编译器(例如 Clang 和 GCC)实际上可以通过编译器扩展来支持零大小的数组。但是,当验证约束的语法时,我是否应该期望编译器采用这种“扩展”行为?而且,这个问题的答案对于替代失败同样正确吗? 此类场景的预期行为是否应该独立于
-pedantic
标志的使用?请注意,Clang 在启用
-pedantic-errors
标志的同时接受此代码示例。演示
T{}
格式错误,用
int[]
替换了 T
。因此,符合标准的编译器必须发出一些诊断信息(无论是警告还是错误)。
Clang 没有这样做,所以它不符合标准。
显然,该标准对
-pedantic
/
-pedantic-errors
标志没有任何规定,但一般来说,如果没有它们,GCC 和 Clang 是不合格的,因为它们不会诊断使用扩展的格式不正确的程序,如果它们只是由于扩展的使用而导致格式错误。但是,据我所知,政策通常是扩展不应影响重载解析等。所以我想说,即使没有给出 -pedantic
/
-pedantic-errors
,这也可能是编译器作者无意的。