这段代码在 C++ 中合法吗?

发布于 2024-08-12 05:03:12 字数 336 浏览 8 评论 0原文

我刚刚发现,当涉及到模板时,此代码会在 g++ 3.4.2 中编译,并且除非不调用 m() ,否则可以正常工作:

template <typename T>
class C
{
     T e;

     public:
        C(): e(0) {};

    void m()
    {
        e = 0;
    };
 };

现在可以创建并使用实例,

C<const int> c;

直到不调用 cm() 为止没有编译错误,但这合法吗?

I just found that when it comes to templates this code compiles in g++ 3.4.2 and works unless m() is not called:

template <typename T>
class C
{
     T e;

     public:
        C(): e(0) {};

    void m()
    {
        e = 0;
    };
 };

Now one may create and use instance

C<const int> c;

Until c.m() is not called there are no compile errors but is this legal?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许久 2024-08-19 05:03:12

是的,这是合法的。模板规范是,在实例化方法之前,它并不存在,因此不会被编译器检查。以下是规范中的相关内容:

14.7.1 - 隐式实例化

-9- 实现不应隐式实例化函数
模板、会员模板、
非虚成员函数,成员
类或静态数据成员
不需要的类模板
实例化。

Yes, this is legal. The template specification is that until a method is instantiated, it doesn't exist and therefor is not checked by the compiler. Here's the relevant bit from the spec:

14.7.1 - Implicit instantiation

-9- An implementation shall not implicitly instantiate a function
template, a member template, a
non-virtual member function, a member
class or a static data member of a
class template that does not require
instantiation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文