从函数返回类型中删除const是否会破坏ABI?

时间:2016-05-31 13:50:57

标签: c++ const abi

假设我有一个库,声明一个函数返回const类型:

class Foo { ... };
const Foo makeFoo();

现在我要从const返回类型中删除makeFoo()(请参阅我的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 ++。

1 个答案:

答案 0 :(得分:1)

关于影响ABI的以下guidelines表明答案是肯定的,它确实打破了ABI兼容性:

  

你不能

     

...

     

对于任何类型的现有功能:

     
      
  • 改变了   以任何方式返回类型
  •   

由于您要将返回类型从const Foo更改为Foo,我会说这会犯规。