将制作一份foo副本: 向量x={foo{“vector foo”}; //(2)将使用聚合初始化->不复制foo: 向量y={foo{“数组foo”}; 返回0; },c++,templates,c++14,variadic-templates,sfinae,C++,Templates,C++14,Variadic Templates,Sfinae" /> 将制作一份foo副本: 向量x={foo{“vector foo”}; //(2)将使用聚合初始化->不复制foo: 向量y={foo{“数组foo”}; 返回0; },c++,templates,c++14,variadic-templates,sfinae,C++,Templates,C++14,Variadic Templates,Sfinae" />

C++ 当底层存储类型复制元素时,如何禁用容器的可变参数构造函数? 请考虑下面的代码片段: template<typename T, class Tuple> class vector { public: template<typename... Elements, typename = decltype(Tuple{ static_cast<T>(std::declval<Elements>())... })> vector(Elements&&... elements) : m_elements{ static_cast<T>(std::forward<Elements>(elements))... } { } private: Tuple m_elements; }; int main() { // (1) Will invoke std::vector<foo>::vector(std::initializer_list<foo>) // -> a foo copy will be made: vector<foo, std::vector<foo>> x = { foo{"vector-foo"} }; // (2) Will use aggregate initialization -> no copies of foo will be made: vector<foo, std::array<foo, 1>> y = { foo{"array-foo"} }; return 0; } 模板 类向量 { 公众: 模板 向量(元素和…元素) :m_元素{static_cast(std::forward(elements))…} { } 私人: 元组m_元素; }; int main() { //(1)将调用std::vector::vector(std::initializer\u list) //->将制作一份foo副本: 向量x={foo{“vector foo”}; //(2)将使用聚合初始化->不复制foo: 向量y={foo{“数组foo”}; 返回0; }

C++ 当底层存储类型复制元素时,如何禁用容器的可变参数构造函数? 请考虑下面的代码片段: template<typename T, class Tuple> class vector { public: template<typename... Elements, typename = decltype(Tuple{ static_cast<T>(std::declval<Elements>())... })> vector(Elements&&... elements) : m_elements{ static_cast<T>(std::forward<Elements>(elements))... } { } private: Tuple m_elements; }; int main() { // (1) Will invoke std::vector<foo>::vector(std::initializer_list<foo>) // -> a foo copy will be made: vector<foo, std::vector<foo>> x = { foo{"vector-foo"} }; // (2) Will use aggregate initialization -> no copies of foo will be made: vector<foo, std::array<foo, 1>> y = { foo{"array-foo"} }; return 0; } 模板 类向量 { 公众: 模板 向量(元素和…元素) :m_元素{static_cast(std::forward(elements))…} { } 私人: 元组m_元素; }; int main() { //(1)将调用std::vector::vector(std::initializer\u list) //->将制作一份foo副本: 向量x={foo{“vector foo”}; //(2)将使用聚合初始化->不复制foo: 向量y={foo{“数组foo”}; 返回0; },c++,templates,c++14,variadic-templates,sfinae,C++,Templates,C++14,Variadic Templates,Sfinae,每当制作T的副本时,如何禁用构造函数?我制作了一个包含foo定义的数组,您想知道Tuple是否是一个聚合吗?@Jarod42 No.std::array是一个聚合,是的,(2)正在使用聚合初始化,以便大括号内的所有右值都是可移动的。但是,如果Tuple是任何一种提供Tuple(Elements&&…Elements)形式的构造函数的类型,只要有可能,就可以移动元素。在任何其他情况下(即,如果我不能确定元组ctor将尽可能移动元素),我不想提供我的ctor。@Jarod42我为什么这样做?这是因为

每当制作
T
的副本时,如何禁用构造函数?我制作了一个包含
foo

定义的数组,您想知道
Tuple
是否是一个聚合吗?@Jarod42 No.
std::array
是一个聚合,是的,(2)正在使用聚合初始化,以便大括号内的所有右值都是可移动的。但是,如果
Tuple
是任何一种提供
Tuple(Elements&&…Elements)
形式的构造函数的类型,只要有可能,就可以移动
元素。在任何其他情况下(即,如果我不能确定
元组
ctor将尽可能移动
元素
),我不想提供我的ctor。@Jarod42我为什么这样做?这是因为我的表单中的一个ctor会尽可能地移动
元素
,我想强制
向量
的用户使用另一种可能性(例如,通过省略的
操作符[]
)来初始化元素。