微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

constexpr 是否应该暗示内联专业化? constexpr 函数

如何解决constexpr 是否应该暗示内联专业化? constexpr 函数

在 MSVC2019 16.10 中,当包含具有静态 constexpr 类函数的特化的标头时,我开始收到“已定义”错误。最小复制案例:

#pragma once

template <typename T>
struct foo
{
    static constexpr void bar() {}
};

template <>
constexpr void foo<int>::bar() {}

在两个源文件中包含这个头文件给出:

Source2.obj : error LNK2005: "public: static void __cdecl foo<int>::bar(void)" (?bar@?$foo@H@@SAXXZ) already defined in Source1.obj

据我所知,在这种情况下, constexpr 应该暗示内联。添加内联或更改为 consteval 工作。也对全局模板函数链接进行专门化。它适用于早期版本的 Visual Studio,并且 clang 也没有问题。这是编译器错误吗?

解决方法

这是编译器错误吗?

好吧,Microsoft 的 own documentation 会建议是的:

constexpr 函数

...
constexpr 函数或构造函数隐式为 inline

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。