加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 可以将实例点延迟到翻译单元的结尾吗?

发布时间:2020-12-16 04:59:38 所属栏目:百科 来源:网络整理
导读:考虑以下小代码片段: #include iostream templateclass T int test(); int main() { std::cout testint() "n"; } // POI for testint() should be right here templateclass T int test() { return 0; } Live Example 为Clang和g编译和打印0. 这是关于功能
考虑以下小代码片段:
#include <iostream> 

template<class T> 
int test(); 

int main() 
{     
    std::cout << test<int>() << "n"; 
} 

// POI for test<int>() should be right here      

template<class T> 
int test() 
{ 
    return 0; 
}

Live Example为Clang和g编译和打印0.

这是关于功能模板实例化的draft Standard报价

14.6.4.1实例点[temp.point]

1 For a function template specialization,a member function template specialization,or a specialization for a
member function or static data member of a class template,if the specialization is implicitly instantiated
because it is referenced from within another template specialization and the context from which it is referenced
depends on a template parameter,the point of instantiation of the specialization is the point of
instantiation of the enclosing specialization. Otherwise,the point of instantiation for such a specialization
immediately follows the namespace scope declaration or definition that refers to the specialization.

Vandevoorde and Josuttis有以下说法:

In practice,most compilers delay the actual instantiation of
noninline function templates to the end of the translation unit. This
effectively moves the POIs of the corresponding template
specializations to the end of the translation unit. The intention of
the C++ language designers was for this to be a valid implementation
technique,but the standard does not make this clear.

问题:Clang / g不符合,因为它们将POI延迟到翻译单元的末尾?

解决方法

Core Working Group defect report 993是为了解决这个问题:

993. Freedom to perform instantiation at the end of the translation unit

Section: 14.6.4.1 [temp.point] Status: C++11 Submitter: John Spicer Date: 6 March,2009
[Voted into the WP at the March,2011 meeting.]

The intent is that it is a permissible implementation technique to do template instantiation at the end of a translation unit rather than at an actual point of instantiation. This idea is not reflected in the current rules,however.

Proposed resolution (January,2011):

Change 14.6.4.1 [temp.point] paragraph 7 as follows:

A specialization for a function template,a member function template,or of a member function or static data member of a class template may have multiple points of instantiations within a translation unit,and in addition to the points of instantiation described above,for any such specialization that has a point of instantiation within the translation unit,the end of the translation unit is also considered a point of instantiation. A specialization for a class template…

C11中的14.6.4.1/7段在N3936中为14.6.4.1/8:

A specialization for a function template,or of a member function or static
data member of a class template may have multiple points of instantiations within a translation unit,and
in addition to the points of instantiation described above,for any such specialization that has a point
of instantiation within the translation unit,the end of the translation unit is also considered a point of
instantiation. A specialization for a class template has at most one point of instantiation within a translation
unit. A specialization for any template may have points of instantiation in multiple translation units. If
two different points of instantiation give a template specialization different meanings according to the one
definition rule (3.2),the program is ill-formed,no diagnostic required.

所以是的,实现允许将模板的实例化点延迟到翻译单元的末尾.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读