考虑以下代码:
#include <iostream>
using f = void(std::string);
void fcorrect(f func, std::string s) {
func(s); // calling function
};
void fmistake(f func, std::string s) {
f(s); // calling type alias instead of function
};
void myprint(std::string s) {
std::cout << s << std::endl;
};
int main() {
std::string s = "message";
fcorrect(myprint, s);
fmistake(myprint, s);
return 0;
}
函数fcorrect
接收myprint
函数和字符串作为参数,并按预期打印该字符串。函数fmistake
包含一个故意的错误 - 它调用类型别名 f
而不是函数func
。它什么也不打印。
我想知道当后一个函数调用发生时,幕后发生了什么?即,为什么没有抛出编译时或运行时错误?
正如评论者所说,
f(s)
这是一个声明。关键的文字在这里:- [stmt.ambig] p1
类型是什么(类、函数等)并不重要,
T(a)
如果T
命名了一个类型,那么它就是一个声明。该声明
f(s)
在这里不执行任何操作,因为它没有被使用,并且相当于f s
orvoid s(std::string)
。s
在此上下文中已经是函数参数std::string s
,因此 GCC 允许它是错误的。海湾合作委员会还允许:这是一个已知的GCC bug 52953,于 2012 年首次报告。