Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
隐式实例化何时会导致问题? 我正在读C++底漆,它说:_C++_Templates - Fatal编程技术网

隐式实例化何时会导致问题? 我正在读C++底漆,它说:

隐式实例化何时会导致问题? 我正在读C++底漆,它说:,c++,templates,C++,Templates,如果未使用成员函数,则不会实例化。只有在使用成员时才会实例化成员,这一事实使我们可以实例化一个类型可能不满足某些模板操作要求的类 我不知道为什么这是个问题。若需要某些操作,为什么编译器不实例化这些操作?有人能举个例子吗?这是一个易于使用的特性,而不是陷阱 惰性实例化用于简化模板。您可以实现任何专门化可能具有的所有可能成员函数集,即使某些函数不适用于某些专门化 它还减少了编译时间,因为编译器永远不需要实例化您不使用的内容 要防止延迟实例化,请使用显式实例化: 模板类我的模板; 这将立即实例化类的

如果未使用成员函数,则不会实例化。只有在使用成员时才会实例化成员,这一事实使我们可以实例化一个类型可能不满足某些模板操作要求的类


我不知道为什么这是个问题。若需要某些操作,为什么编译器不实例化这些操作?有人能举个例子吗?

这是一个易于使用的特性,而不是陷阱

惰性实例化用于简化模板。您可以实现任何专门化可能具有的所有可能成员函数集,即使某些函数不适用于某些专门化

它还减少了编译时间,因为编译器永远不需要实例化您不使用的内容

要防止延迟实例化,请使用显式实例化:

模板类我的模板
这将立即实例化类的所有成员(模板、继承的或尚未定义的成员除外)。对于编译速度较慢的模板,可以在一个源文件(翻译单元)中执行上述操作,然后使用链接器绕过其他源文件中的实例化,方法是在头中添加声明:

extern template class my_template< some_arg >;
外部模板类我的模板
看看是谁说有问题?@sashoalm,这没关系。这是件好事。否则,您将无法使用(比如)仅移动类型的标准容器,因为它们的副本构造函数将无法编译。@potatosatter书中说“可能无法满足某些模板操作的要求”,所以我认为这是一个问题。回答很好。许多虚假的琐事包括这一点,并且经常出错。库多斯:当然,这也是维修坑坠落。对实现者来说似乎合法的模板的更改(因为它们声明了使用模板的先决条件)可能会破坏“编织”某些方法的代码。模板增加了非常有价值的灵活性,但不要误以为这是免费的午餐。对于实现者来说,解决方案是防止延迟实例化(全部或全无),并且很可能在默认情况下将其禁用。(注:也许提及
POI
和/或浅实例化会很好。也许在类接口中使用静态断言来进行早期概念检查)@DanAllen是的,很难为模板库提供良好的测试覆盖率。即将推出的Concepts功能将提供一个快速检查先决条件的工具。@Potatoswatter:这很奇怪,不是吗?如果我建议你可以用纯虚拟函数实例化一个类,只要它们从未被调用过,我就会得到有趣的外观,这是正确的。但对于模板,它接近于标准实践。
extern template class my_template< some_arg >;