【问题标题】:How is class function without definition not causing error没有定义的类函数如何不会导致错误
【发布时间】:2017-08-28 06:47:11
【问题描述】:

我在学习一些 C++ 习语时遇到了 SFINAE 的示例代码,我对代码感到困惑。

注意:is_ptr() 没有定义。

  1. 我自己编译了代码,没有关于缺少函数定义的编译器错误,为什么?

  2. sizeof() 用于其中一个调用,它显然是在函数返回时执行的,但话又说回来,没有定义。这怎么可能?

    template <typename T>
    struct is_pointer
    {
       template <typename U>
          static char is_ptr(U*);
    
       template <typename X, typename Y>
          static char is_ptr(X Y::*);
    
       template <typename U>
          static char is_ptr(U (*)());
    
       static double is_ptr(...);
    
       static T t;
       enum {value = sizeof(is_ptr(t)) == sizeof(char)};
    };
    

【问题讨论】:

  • 邮政编码不是作为图像,而是作为编码格式的文本!
  • 您在某处有该模板类的实例化吗?
  • 我现在在移动设备上,所以无法粘贴代码。我唯一的用法是主函数中的 is_pointer::value
  • 您无需定义即可知道 sizeof - 声明包含您将需要的所有数据。在您真正调用该函数之前,您根本不需要定义。

标签: c++ templates metaprogramming sfinae


【解决方案1】:

sizeof 是所谓的未评估上下文。在其中,表达式只需要格式正确,实际上不会执行任何操作。所以一个只声明的函数可以在内部使用而不需要实际定义。

这是因为确定类型信息不需要定义。在这种情况下,ADL 选择的重载就是所讨论的类型信息。它的返回类型也可以单独从声明中获得。

【讨论】:

  • 谢谢,这让我摸不着头脑,我知道模板函数只会在调用时创建,所以我认为它是按值调用的。
  • @user3414321 - 也有,但在这种情况下,它与正在发生的事情正交。如果您尝试实际执行模板化重载,您会得到预期的错误。
猜你喜欢
  • 2023-01-25
  • 2021-06-23
  • 1970-01-01
  • 2020-06-16
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多