我有一个模板'Foo',它拥有一个 T,我希望它有一个可变参数构造函数,将其参数转发给 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。
我发现的一种可能的解决方案是为 Foo 编写一个“复制构造函数”,它采用非常量 Foo 并使用构造函数转发:
Foo(Foo& other)
: Foo(const_cast<const Foo&>(other)) {}
定义此构造函数后,事情又开始了:现在首选非 const Foo 参数复制 ctor。然而,这对我来说似乎很粗略,因为这种“治疗”似乎比疾病更糟糕。
是否有另一种方法可以实现这种效果,表明自然复制构造函数应该优先于可变参数构造函数?如果没有,定义这个非常量参数复制构造函数是否有任何不利后果?