为什么非内联命名空间不适用于库版本控制?

Why would non-inline namespaces not work for library versioning?

提问人:Dhwani Katagade 提问时间:10/23/2023 最后编辑:Some programmer dudeDhwani Katagade 更新时间:10/23/2023 访问量:62

问:

在对这个问题的回答中,内联命名空间是干什么用的?,内联命名空间被称为库版本控制的一种机制。

我理解答案中提到的使用内联命名空间的整体方法,但不清楚的一件事是,为什么我们不能使用以下方法对非内联命名空间进行库版本控制?

在第一个版本中,具有如下定义。

#include <iostream>

namespace foo {
    template <typename T>
    void bar(T t) {
        std::cout << "bar v1 - " << t;
    }
}

在下一个版本中,将旧版本放在嵌套命名空间 v1 中,将较新版本放在其位置。

#include <iostream>

namespace foo {
    namespace v1 {
        template <typename T>
        void bar(T t) {
            std::cout << "bar v1 - " << t;
        }
    }

    template <typename T>
    void bar(T t) {
        std::cout << "bar v2 - " << t;
    }

}

所有正确的用法将自动升级到 v2,并且可以正常工作。对于 的任何用户,如果他们仍然想链接到 v1,那么他们可以将代码更改为 ,就像问题的链接答案中建议的那样,他们已将内联命名空间用于解决方案。foo::bar()foo::bar()foo::v1::bar()

使用上述不使用内联命名空间的方法,有什么错误或缺失或不起作用?

C++ C++11 模板 内联命名空间

评论

2赞 Some programmer dude 10/23/2023
链接的答案提到的一件事是关于模板专业化。答案还提到还有其他“漏洞”被内联命名空间堵塞,但不幸的是它没有详细说明。
2赞 Toby Speight 10/23/2023
您的建议将导致现有编译代码链接到新实现,从而排除有效的源代码保留更改,例如向函数签名添加新的默认参数。
0赞 n. m. could be an AI 10/23/2023
这不会是二进制向后兼容的。

答: 暂无答案