【发布时间】:2016-05-31 13:50:57
【问题描述】:
假设我有一个库,它声明了一个返回 const 类型的函数:
class Foo { ... };
const Foo makeFoo();
现在我想从makeFoo() 返回类型中删除const(参见我的previous question)。我可以从头文件和 cpp 文件中删除const,重建库,并将我的代码链接到新库。但是,我也有动态链接到这个库的旧代码,我希望它继续与新版本的库一起工作。
那么,第一个问题,从返回类型中删除 const 会破坏 ABI 吗?
第二个问题,实际代码完全不同:它是一个模板类,有一个静态成员函数,后来显式实例化:
// fooMaker.h
template<class Foo>
class FooMaker {
public:
static const Foo make();
};
// fooMaker.cpp
template<class Foo>
const Foo FooMaker<Foo>::make() { ... }
template class FooMaker<Foo1>;
template class FooMaker<Foo2>;
有什么改变吗?
如果这很重要,我在 linux 下使用 g++。
【问题讨论】:
-
@ZunTzu,事实上我看到了两个可能的问题:名称修改和可能的 UB 由于将非 const 对象处理为 const (想象我是 adding const 而不是删除;那么这显然会导致 UB,类似于我之前的问题)。对于前者,我对 g++/linux 的实际答案更感兴趣,好像 g++ 更改了名称修饰方案,那么这将不是唯一的问题。对于后者,我对合法的答案更感兴趣,因为留下一些 UB 或类似的东西是不好的。
-
由于返回类型不是重整函数名称的一部分,因此对名称重整没有影响。
-
实用答案:g++ name mangling 显然不使用返回类型(见here)。
-
法律答案:上次我检查 C++ 时没有标准 ABI。
-
在法律方面:如果定义以这种方式与声明不同,则您违反了 ODR。实际上我怀疑这很重要。