有一条规则说明std :: tuple的成员被破坏了吗?
例如,如果Function1
返回一个std::tuple<std::unique_ptr<ClassA>, std::unique_ptr<ClassB>>
to Function2
,那么我可以确定(当Function2
剩下的范围时)ClassB
第二个成员ClassA
引用的实例在第一个成员引用的实例之前被销毁吗?
std::tuple< std::unique_ptr< ClassA >, std::unique_ptr< ClassB > > Function1()
{
std::tuple< std::unique_ptr< ClassA >, std::unique_ptr< ClassB > > garbage;
get<0>(garbage).reset( /* ... */ );
get<1>(garbage).reset( /* ... */ );
return garbage;
}
void Function2()
{
auto to_be_destroyed = Function1();
// ... do something else
// to_be_destroyed leaves scope
// Is the instance of ClassB destroyed before the instance of ClassA?
}
Run Code Online (Sandbox Code Playgroud) 我注意到在精美打印元组的上下文中提到了"索引技巧".这听起来很有趣,所以我按照链接.
嗯,那不顺利.我理解了这个问题,但实际上并不能跟踪发生的事情.为什么我们甚至需要任何指数?那里定义的不同功能如何帮助我们?什么是'裸露'?等等
有人可以为参数包和可变元组的专家提供那种东西的游戏吗?
我认为扩展参数包具有以下行为:
// for Args ... p
f(p)...;
// was equivalent to
f(p1); f(p2); ...; f(pn);
Run Code Online (Sandbox Code Playgroud)
但我刚刚发现gcc(4.6,4.7和4.8)反过来说:
f(pn); ...; f(p2); f(p1);
Run Code Online (Sandbox Code Playgroud)
而clang按照我的预期做到了.
这是GCC中的错误还是根据标准有效?
最小的例子
#include <iostream>
#include <string>
template<typename T>
bool print(const unsigned index, const T& value){
std::cerr << "Parameter " << index << " is " << value << std::endl;
return true;
}
template<typename ... Args>
void printAll(Args ... args){
unsigned i = 0;
[](...){}(print(i++, args)...);
}
int main(){
int a = 1; float b = 3.14; std::string …
Run Code Online (Sandbox Code Playgroud)