为何无法在匿名结构体上调用成员函数?
为何无法在匿名结构体上调用成员函数?
嗨,这个问题我之前也踩过坑,咱们来拆解一下到底是怎么回事~
首先先看你写的代码:
int main() { auto value = struct { int test() { return 1; } }().test(); }
编译时会报这个错误:
:2:18: error: expected expression 2 | auto value = struct { | ^
问题出在C++里的最令人头疼的解析(Most Vexing Parse)规则上——编译器会把struct { ... }()这种写法,错误地解析成一个函数声明(而不是你期望的“创建匿名结构体的临时对象”)。简单说,编译器觉得你在声明一个返回匿名结构体类型、没有参数的函数,而不是创建一个临时对象,后面跟着的.test()自然就找不到对应的表达式了,所以报错。
那怎么解决呢?其实很简单,给匿名结构体的实例化部分加一对括号,强制编译器把它当成表达式来解析:
int main() { auto value = (struct { int test() { return 1; } })().test(); }
这样编译器就会明确知道,(struct { ... })是一个匿名结构体类型,后面的()是创建它的临时对象,接着就能正常调用.test()成员函数了。
刚好匹配你的使用场景:在宏里用这个写法,既能实现声明结构体并调用成员函数的需求,还能避开lambda的隐式捕获问题,完美~
内容来源于stack exchange
相关产品推荐
相关产品推荐

