テンプレートクラスの特別なメンバー関数(具体的には、コピー/移動コンストラクタやコピー/移動代入演算子)がインスタンス化されるのはいつですか?クラス自体がインスタンス化されるとすぐに、または必要なときにのみ、テンプレートクラスの特別なメンバー関数がインスタンス化されるのはいつですか?
これは、次のような状況で起動します:
test.cpp:9:5: error: the parameter for this explicitly-defaulted copy constructor is const, but a member or base requires it to be
non-const
pair(const pair&) = default;
^
test.cpp:21:18: note: in instantiation of template class 'pair<int, S>' requested here
pair<int, S> p;
^
それはできるだけ早くコピーコンストラクタをインスタンス化しようとすることを示唆している:
template <class T, class U>
struct pair
{
T first;
U second;
pair() : first(), second() {}
pair(const pair&) = default;
};
struct S
{
S() {}
S(const S&) = delete;
S(S&&) = default;
};
int main()
{
pair<int, S> p;
}
クランは、次のエラーで、このコードをコンパイルすることを拒否しますクラスがインスタンス化されます。
しかし、GCCはコードをうまくコンパイルして、実際に必要な場合にのみコピーコンストラクタをインスタンス化しようとします。
どのコンパイラの動作が正しいですか?
(同様の不一致が代入演算子のために展示されています。)
UPDATE:私は、その定義を変更した場合ので、これは、この例ではpair
のコピーコンストラクタがdefault
EDであるという事実とは何かを持っています〜
pair(const pair& p) : first(p.first), second(p.second) {}
このコードはclangも渡します。
-std = C++ 11でclang3.0とコンパイルしてください。 –