有一次我发现下面这段代码无法通过编译。
#include <iostream> using namespace std; struct A { A(int n) {} }; struct B { B(A a) {} int foo() const { return 1; } }; int main() { int n = 1; B b(A(n)); cout << b.foo() << endl; }
错误信息如下。
错误信息显示b是一个非类类型对象。但是我看了半天都不明白这段代码到底哪里有问题。后来问了下别人,然后别人告诉我是编译器误把下面这个语句认为是函数声明了,于是b就被当作一个函数而不是一个类类型对象。语句前面的"B"被认为是函数返回值类型,后面的"b"被认为是函数名。不过问题是,为什么"A(n)"会被认为是函数参数呢?"A(n)"怎么看都不像是函数参数啊,函数参数怎么可能会有括号?
B b(A(n)); //这句被编译器认为是函数声明语句
后来我做了个实验,我尝试定义了一个简单的函数,在这个函数的参数名两边加了一对括号,如下。
#include <iostream> using namespace std; int foo(int (n)) //注意这里的参数"n"两边加了括号 { return n; } int main() { int n = 1; cout << foo(n) << endl; }
结果发现这段代码可以通过编译!这就代表C++中在函数的形参名两边加括号是被允许的。
那么我们应该如何避免让编译器把之前那句语句误认为是函数声明语句呢?很简单,在"A(n)"两边再加一对括号就OK了。
B b((A(n))); //多加一对括号
原文地址:https://www.cnblogs.com/ZhouYiJoe/p/12356039.html
时间: 2024-10-13 10:22:38