相关疑难解决方法(0)

C++ std :: tuple破坏顺序

有一条规则说明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)

c++ std c++11 stdtuple

46
推荐指数
3
解决办法
2752
查看次数

有人可以解释一下"指数技巧"吗?

我注意到在精美打印元组的上下文中提到了"索引技巧".这听起来很有趣,所以我按照链接.

嗯,那不顺利.我理解了这个问题,但实际上并不能跟踪发生的事情.为什么我们甚至需要任何指数?那里定义的不同功能如何帮助我们?什么是'裸露'?等等

有人可以为参数包和可变元组的专家提供那种东西的游戏吗?

c++ tuples indices variadic-templates c++11

14
推荐指数
1
解决办法
3351
查看次数

是否在标准中定义了可变参数模板包扩展的顺序?

我认为扩展参数包具有以下行为:

// 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)

c++ variadic-templates c++11

4
推荐指数
1
解决办法
656
查看次数

标签 统计

c++ ×3

c++11 ×3

variadic-templates ×2

indices ×1

std ×1

stdtuple ×1

tuples ×1