【问题标题】:Template variables with class as typename以类为类型名的模板变量
【发布时间】:2021-02-10 00:54:45
【问题描述】:

我正在学习 C++14,因为遇到了这个模板变量特性,这让我很感兴趣,因此我想对此进行更多研究,我尝试使用多个示例来理解模板变量。说,

template <typename T>
T var;

var<int>;
var<float>;

上面的代码有效,而且看起来也很容易理解。但是,当我尝试使用类名代替 int 或 float 时,会导致为 FOO 类调用临时对象创建,并为临时对象调用相应的 C'tor & dtor。

var<FOO>;  //FOO is a class

我编写了一个示例测试程序及其输出供您理解。我的问题是,

  1. 为什么 var 创建临时对象?
  2. 原始数据类型和用户定义数据类型的模板变量有何不同?

如果不相关或重复,请指出出处以便清楚理解。

参考下面的代码,

class B
{
  public:
  B()
  {
      std::cout<<"\nB ctor"<<std::endl;
  }
  B(const B& obj)
  {
      std::cout<<"B copy ctor"<<std::endl;
  }
  int operator()()
  {
      std::cout<<"operator() called"<<std::endl;
  }
   void f()  {
   //::A().print();   
  }
  ~B()
  {
      std::cout<<"\n~ for B()"<<std::endl;
  }
  
};

//Declaring template variable
template<typename T>
 T g ;

int main() {
    g<int> = 30;
    g<float> = 30.02f;
    g<B> = B{};
    std::cout<<"g value:"<<g<int><<std::endl;
    std::cout<<"g value:"<<g<float>;
}

输出:

B ctor                                                                                                                                         
g value:30                                                                                                                                     
g value:30.02                                                                                                                                  
~ for B()   

【问题讨论】:

  • 1. var 本身不会创建临时对象。 2. 没有。

标签: c++ templates c++14


【解决方案1】:

这个简单的程序不会创建临时对象:

int main() {
  var<SomeClass>;
}

这里创建了一个临时对象:

int main() {
  var<SomeClass> = SomeClass{};
}

但那是因为我们使用SomeClass{} 做到了。然后,我们将其分配var&lt;SomeClass&gt; 非临时对象(在您的许多示例中为全局对象)。

这里运行的代码是

 SomeClass::SomeClass()
 SomeClass::SomeClass()
 SomeClass::operator=(SomeClass&&)
 SomeClass::~SomeClass()
 SomeClass::~SomeClass()

按这个顺序。

#include <iostream>

struct noisy {
  noisy() { std::cout << __func__ << "()\n"; }
  ~noisy() { std::cout << __func__ << "()\n"; }
  noisy(noisy&&) { std::cout << __func__ << "(&&)\n"; }
  noisy(noisy const&) { std::cout << __func__ << "(c&)\n"; }
  void operator=(noisy&&) { std::cout << __func__ << "(&&)\n"; }
  void operator=(noisy const&) { std::cout << __func__ << "(c&)\n"; }
};

template<class T>
T var;

int main() {
    std::cout << "Start of main\n";
    {
        var<noisy> = noisy{};
        std::cout << "Body of main\n";
    }
    std::cout << "End of main\n";
}

live example.

输出:

noisy()
Start of main
noisy()
operator=(&&)
~noisy()
Body of main
End of main
~noisy()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多