c++ - 为什么不扩展可变参数模板参数包?

标签 c++ c++11 variadic-templates

#include<tuple>
#include<iostream>
using namespace std;

class A                                                                                                                                                           
{                                                                                                                                                                 
public:                                                                                                                                                           
  int v;                                                                                                                                                          
  A(int a) : v(a){}                                                                                                                                               
  operator int (){return v;}                                                                                                                                      
};                                                                                                                                                                

class B                                                                                                                                                           
{                                                                                                                                                                 
public:                                                                                                                                                           
  int v;                                                                                                                                                          
  B(int a) : v(a + 1) {}                                                                                                                                              
  operator int (){return v;}                                                                                                                                      
};                                                                                                                                                                

class C                                                                                                                                                           
{                                                                                                                                                                 
public:                                                                                                                                                           
  int v;                                                                                                                                                          
  C(int a) : v(a + 2){}                                                                                                                                               
  operator int (){return v;}                                                                                                                                      
};                                                                                                                                                                


template <typename... Args >                                                                                                                                      
int f(int a, Args... args )                                                                                                                                      
{                                                                                                                                                                 
  tuple<Args...> argstuple1( std::forward<Args>(a)... );                                                                                                          
  tuple<Args...> argstuple2(Args{a}...);                                                                                                                          
  //The following initialization won't compile
  tuple<Args...> argstuple2(Args(a)...);

  cout << (int)std::get<2>(argstuple2) << endl;                                                                                                                   
  return 1;                                                                                                                                                       
}  

int main()
{
  f< A, B, C>(5,0,0,0);
}

我在这里尝试做的是,给定一个值,我有 3 个不同的类以 3 种不同的方式处理同一个值。我在这里得到的问题是如何扩展参数包并使用给定的单个值 a 初始化每个类。

tuple<Args...> argstuple2(Args(a)...);

我认为上面的代码会扩展成

tuple<A, B, C> argstuple2(A(a), B(a), C(a));

看起来编译器不喜欢这样。 但是,以下所有代码都可以正常编译

tuple<Args...> argstuple2(Args(1)...);
tuple<Args...> argstuple2(Args{a}...);
tuple<Args...> argstuple2(std::forward<Args>(a)...);                  

我想知道为什么 Args(a)... 无法展开? Args(a)... 和 Args{a}... 有什么区别? std::forward(a)...) 怎么样?

我正在使用 gnu 4.7.1

最佳答案

// now it will
using tuple_args = tuple< Args... >;                                                                                                                                                                 
tuple_args argstuple3((Args(a))...);

关于c++ - 为什么不扩展可变参数模板参数包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44053274/

相关文章:

c++ - 如果 unique_lock 在其生命周期内不再使用,是否应该在解锁后释放?

c++ - 参数包和移动语义

c++ - 模板参数 - 带有可变参数的函数指针

c++ - 链接/运行时不同 GCC 版本的风险?

C++,比较器,函数指针

c++ - 捕捉 QWidget 真实可见性状态变化

c++ - 检查可变参数模板参数的唯一性

C++ Virtual boost::any 继承

c++ - 为什么这个 move 构造函数不起作用

c++ - 我如何使用 c++11 的正则表达式来匹配一些通用字节?