具有带默认值的指针参数的类模板

bha*_*rat 12 c++ templates

我试图理解下面的代码片段

\n
template <typename T>\nclass testopaque {\npublic:\n    void test(T var = T()) {}\n};\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
int main() {\n    testopaque<int *> obj1;\n    obj1.test();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
int main() {\n    int * var = int *();\n}\n\nerror: expected primary-expression before \xe2\x80\x98int\xe2\x80\x99\nint * ptr = int *();\n
Run Code Online (Sandbox Code Playgroud)\n

Yak*_*ont 10

假设你有x=1+2. 您认为x*39 等于1+2*37 吗?

这里也发生了类似的问题。 和那时int*()不一样了。T=int*T()

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

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


Sam*_*hik 8

这是 C++ 复杂的语法和语法如何产生意想不到的结果的示例:

int *();
Run Code Online (Sandbox Code Playgroud)

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

您需要告诉您的 C++ 编译器您想要在这里完成什么:

typedef int *intp;

int main()
{
    int * var = intp();
}
Run Code Online (Sandbox Code Playgroud)

  • 就像有人走过来说“你知道有些语言如何拥有图灵完备的解析器吗?我们可以做到*那样*,但以某种方式让它变得更加混乱吗?” 于是C++诞生了。 (3认同)

Sea*_*ean 6

当您使用如下表达式时:

T var = T();
Run Code Online (Sandbox Code Playgroud)

哪里T是指针类型然后var将被赋值nullptr