编译器扩展在需求子句中被接受

问题描述 投票:0回答:1

我预计以下代码会被拒绝,因为 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
标志的同时接受此代码示例。

演示

c++ language-lawyer c++-concepts c++23
1个回答
0
投票
T{}

格式错误,用

int[]
替换了
T
因此,符合标准的编译器必须发出一些诊断信息(无论是警告还是错误)。

Clang 没有这样做,所以它不符合标准。

显然,该标准对

-pedantic

/

-pedantic-errors
标志没有任何规定,但一般来说,如果没有它们,GCC 和 Clang 是不合格的,因为它们不会诊断使用扩展的格式不正确的程序,如果它们只是由于扩展的使用而导致格式错误。
但是,据我所知,政策通常是扩展不应影响重载解析等。所以我想说,即使没有给出 

-pedantic

/

-pedantic-errors
,这也可能是编译器作者无意的。
    

© www.soinside.com 2019 - 2024. All rights reserved.