gpt4 book ai didi

c++ - 模板是如何实例化的?

转载 作者:IT老高 更新时间:2023-10-28 22:14:25 26 4
gpt4 key购买 nike

这是C++ Primer 5th Edition中的一个练习:

Exercise 16.27: For each labeled statement explain what, if any, instantiations happen. If a template is instantiated, explain why; if not, explain why not. P.677

template <typename T> class Stack { };

void f1(Stack<char>); // (a)

class Exercise {
Stack<double> &rsd; // (b)
Stack<int> si; // (c)
};

int main() {
Stack<char> *sc; // (d)
f1(*sc); // (e)
int iObj = sizeof(Stack< string >); // (f)
}

以下是我尝试过的:

(a) Stack<char>被实例化,但没有任何成员被实例化。

(b) Stack<double>被实例化,但没有任何成员被实例化。

(c) Stack<int>并实例化其默认构造函数。

(d) (e) 完全不知道...

(女) Stack< string >被实例化,但没有任何成员被实例化。

我说的对吗?谁能告诉我这段代码是如何实例化的?

最佳答案

在您的具体情况下,声明并不意味着实例化

#include <iostream>
using namespace std;


template <typename T> class Stack {
typedef typename T::ThisDoesntExist StaticAssert; // T::ThisDoesntExist doesn't exist at all!
};


void f1(Stack<char>); // No instantiation, compiles

class Exercise {
Stack<double> &rsd; // No instantiation, compiles (references don't need instantiation, are similar to pointers in this)

Stack<int> si; // Instantiation! Doesn't compile!!
};


int main(){

Stack<char> *sc; // No Instantiation, this compiles successfully since a pointer doesn't need instantiation

f1(*sc); // Instantiation of Stack<char>! Doesn't compile!!

int iObj = sizeof(Stack< std::string >); // Instantiation of Stack<std::string>, doesn't compile!!

}

注意指针/引用的东西:它们不需要实例化,因为实际上没有分配数据(指针只是包含地址的几个字节,不需要存储所有数据..看看pimpl idiom)。

只有在分配了东西时,模板必须被完全解析(这发生在编译时,这就是为什么它们通常需要声明和定义..还没有链接阶段)

关于c++ - 模板是如何实例化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com