You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20中std::unique_ptr<void>对应的requires表达式触发编译错误而非返回false的问题咨询

C++20中std::unique_ptr对应的requires表达式触发编译错误而非返回false的问题咨询

最近我在尝试C++20的concepts和requires表达式,根据标准定义,requires表达式应该检查某个表达式的合法性,如果表达式无效就返回false,而不会导致编译错误。不过我在GCC和Clang上测试std::unique_ptr<void>时遇到了不符合预期的行为:

测试代码

#include <memory>

template <typename T>
inline constexpr bool is_dereferenceable_v = requires(T t) { *t; };

static_assert(!is_dereferenceable_v<std::unique_ptr<void>>); // *按预期应该通过*
static_assert(is_dereferenceable_v<std::unique_ptr<void>>); // *按预期应该失败*

预期行为

对于std::unique_ptr<void>来说,*t这个表达式是不合法的(因为解引用void*是无效操作),所以requires表达式应该返回false。因此static_assert(!is_dereferenceable_v<std::unique_ptr<void>>)应该能通过编译。

实际行为

GCC(最新主干版本)和Clang(最新主干版本)都会直接抛出编译错误,原因是它们尝试实例化unique_ptr<void>的operator*(),而这个运算符的noexcept(*pointer)异常说明符导致了问题。不管我是断言true还是false,两个static_assert都会失败。

不过MSVC似乎能正常处理这段代码(推测它在这个场景下忽略了noexcept的检查)。

我的疑问

这种情况是GCC/Clang的bug吗?根据标准,requires { *t; }对于无效的表达式应该返回false,而不是触发编译错误才对。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:28:02