Tを所有するテンプレート「Foo」があり、引数をTのコンストラクターに転送する可変個引数コンストラクターが必要です。
template<typename T>
struct Foo {
Foo()
: t() {}
Foo(const Foo& other)
: t(other.t) {}
template<typename ...Args>
Foo(Args&&... args)
: t(std::forward<Args>(args)...) {}
T t;
};
ただし、これによりFooはコピーできなくなります。
int main(int argc, char* argv[]) {
Foo<std::shared_ptr<int>> x(new int(42));
decltype(x) copy_of_x(x); // FAILS TO COMPILE
return EXIT_SUCCESS;
}
なぜなら、この回答によれば、引数が一定でないため、可変個引数コンストラクターがより適切に一致するからです。明らかな理由で、発信者にconst_castの使用を強制したくありません。
私が見つけた1つの可能な解決策は、非const Fooを受け取り、コンストラクター転送を使用するFooの「コピーコンストラクター」を作成することでした。
Foo(Foo& other)
: Foo(const_cast<const Foo&>(other)) {}
このコンストラクターが定義されると、物事は再び機能します。現在、非constFoo引数copyctorが優先されます。しかし、これは私には非常に大雑把に思えます。この「治癒」は病気よりも悪いように思われるからです。
この効果を実現する別の方法はありますか?可変個引数コンストラクターよりも自然コピーコンストラクターを優先する必要があることを示しますか?そうでない場合、この非定数引数コピーコンストラクターを定義することの悪影響はありますか?