C++ 如何构造不可移动不可复制对象的元组?

C++ 如何构造不可移动不可复制对象的元组?,c++,c++14,c++17,C++,C++14,C++17,有可能以某种方式构造这样一个元组吗 #包括 结构A { A()=默认值; A(常数A&)=删除; A(A&&)=删除; }; 自动生成() { //在一行上构造元组的函数。。。 返回std::make_tuple(A{},A{}); } int main() { 自动t=generate(); } 这在C++14中可能吗?在C++17中可能吗?它强制执行返回值优化(未命名的prvalue返回表达式) tuple的构造函数根据与tuple模板参数类型完全相同的参数初始化对象,该构造函数要求类型是

有可能以某种方式构造这样一个
元组吗

#包括
结构A
{
A()=默认值;
A(常数A&)=删除;
A(A&&)=删除;
};
自动生成()
{
//在一行上构造元组的函数。。。
返回std::make_tuple(A{},A{});
}
int main()
{
自动t=generate();
}
这在C++14中可能吗?在C++17中可能吗?它强制执行返回值优化(未命名的prvalue返回表达式)


tuple
的构造函数根据与
tuple
模板参数类型完全相同的参数初始化对象,该构造函数要求类型是可复制构造的。但是,如果所有类型都是默认可构造的,则可以这样做。所以你可以让
generate
发出
返回元组{}。这在C++17中工作

如果要使用值初始化它们,则可以使用
tuple
构造函数,该构造函数使用与
tuple
参数不同的类型序列的显式转换。在这里,您可以使用C++17保证的副本省略,但前提是源类型使用
操作符Type()
重载并遵循保证的省略规则

std::tuple<A,A> generate() { return {}; }
现在您可以:

std::tuple<A,A> generate() {
  return {
    maker<A>( []{ return A{}; } ),
    maker<A>( []{ return A{}; } )
  };
}
std::tuple generate(){
返回{
maker([]{返回一个{};}),
maker([]{返回一个{};})
};
}

那些lambda可以做任何返回
A

“这在C++17中可能吗”你说“将”,就好像C++17还不到2年,而且(大部分)在这一点上受到主要编译器的支持一样。@MaximeGroushkin因为保证省略。@LightnessRacesinOrbit但并不总是保证,请参阅。但在这个特殊的案例中,你是对的。@MaximEgorushkin是的,你的评论让人觉得这是一个古怪、疯狂的想法。然而,当它成为事实时(在纸面上)却在MSVS 2017中被打破了。我不得不放弃在一个好函数中生成的不可复制/不可移动的类流类型,因为VS拒绝省略返回。所以我现在还不相信这个。(虽然MSVS2019现在已经推出,所以我们正在努力!)
std::tuple<A,A> generate() {
  return {
    maker<A>( []{ return A{}; } ),
    maker<A>( []{ return A{}; } )
  };
}