【问题标题】:Class template having pointers arguments with default value具有带默认值的指针参数的类模板
【发布时间】:2021-12-30 14:19:38
【问题描述】:

我正在尝试理解下面的代码 sn-p

template <typename T>
class testopaque {
public:
    void test(T var = T()) {}
};

使用指针类型示例 int * 调用时,默认参数如何工作

int main() {
    testopaque<int *> obj1;
    obj1.test();
}

当调用 obj1.test() 时编译器会生成什么。尝试时出现编译器错误

int main() {
    int * var = int *();
}

error: expected primary-expression before ‘int’
int * ptr = int *();

【问题讨论】:

  • 它更像是 using T = int*; T var = T(); 编译 - 实时 - godbolt.org/z/vYzoxza89
  • 长话短说,默认初始化的指针是零初始化的指针。它被初始化为一个空指针。

标签: c++ templates


【解决方案1】:

假设你有x=1+2。你会期望x*3(即 9)等于 1+2*3(即 7)吗?

这里也发生了类似的问题。 int*()T=int*T() 不同。

试试(int*){},它解决了组合解析和预测问题。或者using T=int*; int* x=T();,甚至int*x={};

(由于类型的解析方式,简单地使用(int*)() 并不能解决问题,如果您重视自己的理智,这可能是您不想深入研究的问题。)

【讨论】:

    【解决方案2】:

    这是一个例子,说明 C++ 的复杂语法和文法如何产生意想不到的结果:

    int *();
    

    您的 C++ 编译器很想将此构造解释为“返回指向 int 的指针的函数”。您的 C++ 编译器屈服于这种诱惑,并得到了观察到的结果。

    你需要教你的 C++ 编译器你想在这里完成什么:

    typedef int *intp;
    
    int main()
    {
        int * var = intp();
    }
    

    【讨论】:

    • 就像有人走过来说“你知道有些语言是如何拥有图灵完备的解析器的吗?我​​们可以那样做,但不知何故让它变得更加混乱吗?”于是 C++ 诞生了。
    • 当然写intp var = intp();会更清楚?
    【解决方案3】:

    当您使用如下表达式时:

    T var = T();
    

    其中T 是指针类型,那么var 将被分配nullptr

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 2019-01-09
      • 2019-06-20
      • 2018-02-27
      • 2014-02-03
      • 2015-01-20
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多