2017-01-20 12 views
7

タイトルはすべてです。私は、デフォルト値を持つクラスのメンバ関数に引数を追加します。議論は単純な型ではない。これはABIを壊しますか?私の新しいライブラリのバージョンがM.m.0になり、M.m-1.xを使用するすべてのリンクされたアプリケーションのドロップイン置換として利用できるはずです。関数にデフォルト値の引数を追加するとABIが壊れますか?

サンプルコード:

// These are some classes: base and child : public base 

/* Version 1.2.3 */ 
class foo() { 
public: 
    void do_that_stuff(const std::string a); 
} 

/* Version 1.3.0 */ 
class foo() { 
public: 
    void do_that_stuff(const std::string a, const base& b = base()); 
} 

PS:私は私自身のテストを行なったし、それが働いています。ちょうど確信できない

+4

名前はすべてそれを言います。デフォルトの引数は* arguments *であり、関数型とは何も関係しません(特に、関数のパラメータで)。 –

+1

_「これはABIを後ろに壊しているのですか?」_すみません? –

+1

'do_that_stuff'は古いコンパイルと新しいコンパイルで異なる名前を持つことになるでしょう - 私はABIとの互換性の定義に違反していると思います。 –

答えて

10

ほとんどのC++ ABIは、シンボル名の[member]関数の引数型をエンコードします。デフォルトの引数は通常、呼び出し時に呼び出される一時的なオブジェクトとして実装されます。これらが使用されているABIに対して行われた選択である場合、デフォルトの引数を追加するとABIが変更されます。そのような場合には、使用される特定のABIを決定する必要があります。

+0

好奇心で、この変化によって壊れないABIを知っていますか? – Oliv

+1

@オリーブ:私は気づいていない。しかし、ABI *はデフォルトの引数を持つ関数に対して複数のシンボルを生成することができます。これは、ABIを破ることなくクラスを変更するアプローチになります(変更された関数が 'virtual'ではないと仮定します)。デフォルトの引数を使用すると、関数は、他のすべての引数を呼び出すときにオーバーロードされ、デフォルトの引数。 –

関連する問題