您对此感到困惑是可以原谅的,这是 C++ 的上下文敏感特性以及编译器如何解释它的一个例子。
int (i);
被视为“i”的声明(并且由于您在此范围内已经有一个名为 i 的变量并且尚未启用 -Wno-shadow,因此不允许这样做)。
与以下无法编译的情况对比:(请参阅http://ideone.com/QuwnTC)
#include <iostream>
class Bark {
public:
Bark(const char* msg, const char*) {
std::cout << "Hear ye, hear ye. " << msg << std::endl;
}
};
void bark(const char* i) {
Bark (i); // error here.
}
int main(int argc, const char* argv) {
bark("wtf");
}
它抱怨 Bark (i) 掩盖了“i”的声明。
但是,以下两个都可以编译:http: //ideone.com/dcGMET
void bark(const char* i) {
Bark (i + 1);
}
或在括号内有两个参数:(http://ideone.com/tMzSY9)
#include <iostream>
class Bark {
public:
Bark(const char* msg, const char*) {
std::cout << "Hear ye, hear ye. " << msg << std::endl;
}
};
void bark(const char* i) {
Bark (i, NULL);
}
int main(int argc, const char* argv) {
bark("wtf");
}
显然,这里对“类型(名称)”的处理是某种特殊情况,您可能想向编译器开发人员提出这个问题。