Lambda转换函数指针比较:下述断言是否会触发?
这个断言有可能触发吗?
先看你给出的代码示例:
template<typename T> auto destructor() { return +[](void* p){ ((T*)p)->~T(); }; } assert(destructor<int>() != destructor<char>());
咱们拆解一下核心问题:
- C++标准只要求Lambda转换后的函数指针和Lambda本身行为一致,但并没有强制规定不同模板实例化出来的Lambda,其转换得到的函数指针必须不同。
- 关键细节:
int和char都属于平凡析构类型,它们的析构函数是空操作。这意味着两个Lambda的函数体((T*)p)->~T();实际什么都不做——二者的执行逻辑完全一致。 - 这种情况下,编译器有权进行优化:把这两个模板实例生成的Lambda对应的函数指针合并成同一个(既然逻辑完全相同,没必要保留两份)。
那断言的触发情况就分两种:
- 如果编译器做了上述合并优化,两个函数指针是同一个,断言条件不成立,不会触发;
- 如果编译器没做这个优化(比如出于调试模式、特定编译选项等原因),两个函数指针不同,断言条件成立,就会触发。
总结来说:这个断言有可能触发,也有可能不触发,结果完全取决于编译器的优化策略——标准没有强制约束这类场景必须生成不同的函数指针,所以属于未定义行为范畴。
内容的提问来源于stack exchange,提问作者Passer By
相关产品推荐
相关产品推荐

