2017-10-02 8 views
0

C++ライブラリに移動セマンティクスを導入しています。
割り当てクラス が実際に割り当てを移すときに無効な代入演算子についていくつかの前提が行われたため、割当てられたライブラリを使用するコードがあります。 代入演算子について無効です。これは、図書館に明確な 文書がないことと、 クライアントコードのいくつか疑わしい慣行の組み合わせです。それにもかかわらず、テンプレート クラスの移動代入演算子が使用されているコードに、すべて の場所を簡単に見つける方法を探したいと思います。C++で移動代入演算子のすべての用途を見つけるためのツール

移動割り当てが呼び出されたときにコンパイラエラーを強制することによってこれを行う方法を考え出しました。 gccでは、これが直接呼び出しであれば、 呼び出しのソースコードに行番号が表示されます。残念ながら、間接呼び出しの場合は 、私は行番号を取得しません。 私もclangを試しましたが、そこには運がありません。

問題はこれです。 テンプレートテンプレートクラス<クラスT > Foo {...}、 コンパイルがどのタイプでもインスタンス化されたときに失敗するように移動代入演算子を定義できます。 これは私に行番号を与えますクライアントコード が直接呼び出すようにしたい。 しかしながら、部材を有する、クラスXが存在する場合、Fooの<がint >言い、 及びXは、この演算子の呼び出しがエラー、 だけ行番号としてフラグ付けされます次に、暗黙的に定義されたムーブ代入演算子、 を取得私はgccに入り、clangはクラスXの定義の 行番号、 であまり役に立ちません。

誰もがこれを助けるツールを知っていますか?

ありがとうございます!

+1

書籍、**ツール**、ソフトウェアライブラリ、チュートリアルまたはその他のオフサイトリソースをお勧めするか質問する質問はオフトピックです –

+1

* *ツール*よりもむしろ、そうでなければすぐに閉じられるでしょう。 – HolyBlackCat

+0

私の質問がどのように表現されたかにかかわらず、私は素晴らしい答えを得ました...そうです。 – Victor

答えて

4

移動コンストラクタを[[deprecated]]とマークします。

次のコードの場合:

main.cpp: In constructor 'B::B(B&&)': 
main.cpp:9:12: warning: 'A<T>::A(A<T>&&) [with T = int]' is deprecated [-Wdeprecated-declarations] 
    struct B 
      ^
main.cpp:6:24: note: declared here 
     [[deprecated]] A(A &&) {/*...*/} 
         ^
main.cpp: In function 'int main()': 
main.cpp:17:19: note: synthesized method 'B::B(B&&)' first required here 
     B y((B&&)x); 
       ^

したいすべての行番号が含まれています

#include <iostream> 

template <typename T> struct A 
{ 
    A() {} 
    [[deprecated]] A(A &&) {/*...*/} 
}; 

struct B 
{ 
    A<int> a; 
}; 

int main() 
{ 
    B x; 
    B y((B&&)x); 
} 

GCCは私にこの警告を与えます。


OPが検出されたため、__attribute__((deprecated))を使用して古いGCCバージョンをサポートすることもできます。

+0

パーフェクト! 1つはgcc 5が必要です。 – Victor

+0

実際には、__attribute __(廃止予定)もまたgcc 4.8で動作します。これは素敵です – Victor

+0

@Victorよろしくお願いします!おそらく、答えの左側にある緑色の目盛りを押してください(あなたの問題が解決したことを示すために)(https://stackoverflow.com/help/accepted-answer)。 – HolyBlackCat

関連する問題