c++ 自定义格式化程序在clang和gcc中编译失败,但在MSVC中编译成功

xghobddn  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(179)

以下代码在gcc 14(link)和clang 17(link)中编译失败,但在MSVC 17.6.2中成功。gcc和clang抛出了大量对我来说没有意义的错误。错误消息太长,无法在此发布。详情请参阅相关链接。有人能帮我弄明白这是怎么回事吗?格式库在gcc和clang中是相当新的。这可能是库实现的bug吗?

#include <format>
#include <iostream>

enum struct enum_t: unsigned {
    cat,
    dog
};

template <>
struct std::formatter<enum_t>: formatter<unsigned> {
    auto format(enum_t v, format_context& ctx) {
        return formatter<unsigned>::format(unsigned(v), ctx);
    }
};

int main() {
    std::cout << std::format("{}", enum_t::cat) << '\n';
}
wnavrhmk

wnavrhmk1#

关于libstdc++产生的错误:
根据BasicFormatter requirements,必须可以在格式化程序专门化类型的const限定对象上调用format
您的format成员函数不是const限定的,因此它不能在这样的调用中使用(并且它还对基类隐藏了format)。
你需要const-限定成员函数:

template <>
struct std::formatter<enum_t>: formatter<unsigned> {
    auto format(enum_t v, format_context& ctx) const {
        return formatter<unsigned>::format(unsigned(v), ctx);
    }
};

这个要求在C20中没有,但在当前的C23草案中通过LWG 3636的解决方案。我认为它是一个缺陷报告,所以如果你用-std=c++20编译,它也应该适用。
我还不知道Clang with libc++的代码有什么问题。我会调查。。

相关问题