如何基于条件调用不同构造函数在栈上实例化C++类?
问题原因分析
你的代码无法编译主要有4个问题:
- 类定义语法错误:第二个构造函数
A(int value)声明末尾缺分号,类结束大括号后缺分号 main函数返回值不符合C标准,C要求main返回值为int,不支持void main的写法- 变量拼写错误:
condtion应为condition - 三目运算符的两个分支返回值类型不兼容:三目运算符要求两个分支的返回值可以隐式转换为同一个公共类型,这里
"123"是const char*类型,456是int类型,二者没有兼容的公共类型,无法通过编译
解决方案
推荐用立即调用lambda表达式实现分支构造,支持C++11及以上版本,编译器会自动做返回值优化,直接在栈空间构造实例,没有额外的拷贝开销,代码示例如下:
#include <string> class A { public: A(std::string str) {} A(int value) {} }; int main() { bool condition = true; A class_a = [&] { if (condition) { return A("123"); } else { return A(456); } }(); return 0; }
如果你的类禁止拷贝/移动,也可以用定位new的方式在预先申请的栈空间上构造,不过写法相对繁琐,一般场景下上述lambda方案足够使用。
内容的提问来源于stack exchange,提问作者Tomatin
相关产品推荐
相关产品推荐

