如何在标准C++17中向固定签名函数传递临时数组?
直接调用
foo的简洁方案:复合字面量 当然可以!你完全不需要临时变量或者模板包装函数,借助C99引入的复合字面量特性,就能实现像你期望的那种简洁调用方式,而且完全适配foo的固定签名。
具体调用写法
直接在函数参数位置构造符合要求的数组即可:
foo(3, (char const * const []){"one", "two", "three"});
原理说明
(char const * const [])是复合字面量的类型声明,和foo第二个参数char const * const argv[]的类型完全匹配;- 后面的
{"one", "two", "three"}是数组的初始化列表,编译器会在调用点临时创建这个数组,然后自动退化为对应的指针传递给foo; - 这种写法在主流C编译器(GCC、Clang、MSVC)中也完全支持(属于C对C特性的兼容扩展,C++11及以后均可正常使用),刚好满足你编译期已知测试用例的场景。
为什么这能替代临时变量/模板?
相比你之前的两种写法:
- 省去了单独定义临时数组的步骤,代码更紧凑;
- 不需要额外写模板包装函数来推导数组大小,直接显式指定元素个数(你测试时编译期已知这个数值)即可。
内容的提问来源于stack exchange,提问作者Krzysiek Karbowiak
相关产品推荐
相关产品推荐

