我试图理解下面的代码片段
\ntemplate <typename T>\nclass testopaque {\npublic:\n void test(T var = T()) {}\n};\nRun Code Online (Sandbox Code Playgroud)\n使用指针类型示例 int * 调用时默认参数如何工作
\nint main() {\n testopaque<int *> obj1;\n obj1.test();\n}\nRun Code Online (Sandbox Code Playgroud)\n调用 obj1.test() 时编译器会生成什么。当我尝试时出现编译器错误
\nint main() {\n int * var = int *();\n}\n\nerror: expected primary-expression before \xe2\x80\x98int\xe2\x80\x99\nint * ptr = int *();\nRun 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*)()由于类型的解析方式,简单地使用并不能解决问题,如果您重视自己的理智,这可能是您不想深入研究的问题。)
这是 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)