C++20中int类型prvalue调用为何无意义?MSVC行为存疑
C++20中int类型prvalue调用的标准规则解析
这看起来是个离谱的问题,但MSVC的表现确实让人摸不着头脑——依据C++20标准的哪条规则,调用int类型的prvalue属于无意义操作?对应的测试代码如下:
// clang: 不通过,gcc: 不通过,msvc: 为何能通过? static_assert(requires { requires noexcept(int{}()); });
标准依据
根据C++20标准的**[expr.call](函数调用表达式)条款:
函数调用的操作数必须是可调用实体,包括函数、函数指针、成员函数指针,或者重载了operator()的类/对象类型。而int是标量类型,既不属于可调用实体范畴,也没有定义operator()成员,因此int{}()这种试图对int类型prvalue执行函数调用的表达式,本身是格式错误**的,属于无意义操作。
编译器差异说明
Clang和GCC都严格遵循标准,正确识别了这个错误并拒绝编译;但MSVC在此处出现了非标准行为,错误地允许了该表达式通过编译。
内容的提问来源于stack exchange,提问作者303
相关产品推荐
相关产品推荐

